在R中如何在2个包之间共享变量

3

我在R中创建了2个包。其中一个包中的变量在另一个包的函数中使用。因此,我在全局范围内声明了变量,如 var <<- "value"。现在所有的函数都可以正常工作。但是这些变量现在对所有人都是可访问的。如果变量的值被任何用户更改,很多函数就无法正常工作。是否可能创建一个变量并仅在特定的包中使用该变量?


1
看看这个有没有用:http://stat.ethz.ch/R-manual/R-devel/library/base/html/environment.html - Maxim.K
2
为什么你的程序包中的函数之间不明确传递变量呢? - hadley
@hadley:每个函数内部都使用了很多变量,所以将所有变量传递给每个函数并不是一个好的方法。 - Dinoop Nair
1
如果有许多变量需要传递,您也可以将它们放在一个配置对象中,即一个 list - Paul Hiemstra
2个回答

4
将设置存储在 options 中,而不是.GlobalEnv 中的变量。您可以将 options 用作键值存储,或者分配例如 list 到一个键(可能是您的软件包名称),就像我在pander package中所做的那样。正如您所看到的,我甚至创建了一些帮助函数来更新/查询这些列表元素。

快速示例:

> options(foo = list(a = pi, b = 1:3))
> getOption('foo')
$a
[1] 3.141593

$b
[1] 1 2 3

> getOption('foo')['a']
$a
[1] 3.141593

很酷。但是即使如此,这也无法阻止一个决心修改值的用户通过相同的机制进行修改 :-( - Carl Witthoft
@CarlWitthoft - 当然,就像没有其他东西一样 :) 我的意思是,您可以将值存储在包命名空间或任何其他位置,用户始终可以选择覆盖它 - 除非您禁止某些情况,例如使用sandboxR - daroczig
这是一个很酷的方法。那么下面这个方法呢?
url <- "http://mytext.com" file <- "我下载的内容" cacheEnv <- new.env() assign(url, file, envir=cacheEnv) get(url, envir=cacheEnv)
- Dinoop Nair
2
@DinoopNair:在我看来,用户不会无意中覆盖options中设置的任何内容,但是另一方面,用户可以有意地覆盖R中的任何内容(甚至在包命名空间中 - 这将是一个比某些随机环境更安全的解决方案来存储您的变量)。 - daroczig

1

通过创建新的环境,可以实现这一点。http://digitheadslabnotebook.blogspot.in/2011/06/environments-in-r.html

>cacheEnv <- new.env()
> url <- "http://mytext.com"
> file <- "This is the content I downloaded"
> cacheEnv <- new.env()
> assign(url, file, envir=cacheEnv)
> get(url, envir=cacheEnv)
[1] "This is the content I downloaded"

用户无法直接编辑变量。他们只能使用环境名称来编辑变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接