【问题标题】:How to limit the scope of the variables used in a script?如何限制脚本中使用的变量的范围?
【发布时间】:2011-09-01 19:24:48
【问题描述】:

假设我编写了一个使用一些变量的 R 脚本。当我运行它时,这些变量会使全局 R 环境变得混乱。为了防止这种情况,我如何将脚本中使用的变量范围限制在该脚本中?注意:我知道一种方法是使用函数,还有其他方法吗?

【问题讨论】:

  • 你能否举一个简短的例子来说明一个 R 脚本以你想要阻止的方式修改你的全局环境?
  • 当然:{n

标签: r scope


【解决方案1】:

只需将local=TRUE 参数用于source 并在您的全局环境之外的其他地方评估source。这里有一些方法可以做到这一点(假设您不希望能够访问脚本中的变量)。 foo.R 只包含print(x <- 1:10)

do.call(source, list(file="c:/foo.R", local=TRUE), envir=new.env())
#  [1]  1  2  3  4  5  6  7  8  9 10
ls()
# character(0)

mysource <- function() source("c:/foo.R", local=TRUE)
mysource()
#  [1]  1  2  3  4  5  6  7  8  9 10
ls()
# [1] "mysource"

sys.source 可能是最直接的解决方案。

sys.source("c:/foo.R", envir=new.env())

如果您想访问变量,您还可以在附加环境中评估文件。请参阅?sys.source 中的示例了解如何执行此操作。

【讨论】:

  • 你能告诉我如何处理我认为他要求的......要封装的多个函数和对象吗?
  • @Dwin:不确定你的意思。像sys.source 这样的东西进入环境?
  • 我想象他可能想要多个功能,这些功能可以在环境中以某种方式访问​​,但不会出现在 ls() 中。
【解决方案2】:

您可以使用local 函数。

【讨论】:

  • 这太明显了 ;-) 你仍然需要 local=TRUE in source
  • @Joshua,假设用户正在使用源代码,他们也可以进行复制和粘贴,或者使用在幕后进行复制/粘贴的编辑器。您可以将整个脚本包装在 local({...})(或您想要本地化的部分)中,然后获取或复制/粘贴(但感谢您指出简单的 local=TRUE 获取源代码)。
  • 好点。当我看到“运行脚本”时,我认为 source 或 Rscript。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
相关资源
最近更新 更多