1

我在 R 中有许多松散相关的数据分析脚本。其中一些脚本的代码可以从全局环境中删除所有变量,以便在运行后擦除敏感信息。其他脚本的变量名称与其他脚本中的相同,因此会覆盖关键变量。

我希望能够将整个脚本/R 文件设置到一个单独的环境中,这样它的变量和函数就不会直接存储在全局环境中。我知道如果通过 source() 函数从另一个脚本调用脚本,则可以做到这一点;但是,有没有办法在脚本本身内创建一个环境并让整个脚本(数千行)将其所有变量和函数保存到该环境而不是全局环境中?

4

2 回答 2

4

如果您以这种方式在 R 中重复使用多个脚本,最好将您的脚本组织成函数,并用这些函数构建一个包。这使您的 R 代码保持在易于加载的可重用块中,并保持您的全局工作空间干净。

但是,我意识到,如果您有许多非常长且复杂的单独脚本,这可能说起来容易做起来难。

解决此问题的一种方法是将代码包装在自己的环境中。例如,如果你把

with(new.env(), {

在脚本的顶部,并且

})

最后,您的脚本将在自己的环境中运行。

例如:

rm(list = ls())

with(new.env(), {
 
 # Start of original script code

 a <- 1
 b <- 2
 print(a + b)
 
 # End of script code

 })
#> [1] 3

我们可以看到全局环境仍然是空的:

ls()
#> character(0)

如果您希望在脚本完成后能够访问脚本中生成的变量,您可以改为运行:

script1 <- new.env()
with(script1, {
 
 # Start of original script code

 a <- 1
 b <- 2
 print(a + b)
 
 # End of script code
 
 })
#> [1] 3

现在我们在全局工作区中有一个名为script1

ls()
#> [1] "script1"

我们可以使用$操作符访问它的内容:

script1$a
#> [1] 1

reprex 包于 2021-11-01 创建 (v2.0.0 )

于 2021-11-01T22:26:56.350 回答
2

1)本地而不保存将您的脚本包含在本地:

local({
  # script goes here
})

脚本退出时环境会自动销毁。

2)本地保存如果你想保存环境,那么使用它来保存它在 .e 中。

.e <- local({
  # script goes here
  environment()
})

3) 搜索路径如果您想轻松访问脚本创建的对象而不将它们放在全局环境中,另一种变体是将环境转换为列表并将其放在搜索路径上。search()可用于查看搜索路径以验证它是否存在。将名称更改为您喜欢的任何名称。

local({
  # script goes here
  environment() |> as.list() |> attach(name = "myobjects")
})

一旦运行,创建的对象可以通过引用它们的名称来读取,就好像它们在全局环境中一样。要从搜索路径中删除列表并销毁它,请使用detach("myobjects").

于 2021-11-02T00:20:00.580 回答