R 如何从函数中访问包变量?

R 如何从函数中访问包变量?,r,scope,R,Scope,如何从同一个包中的函数访问包变量 以下代码仅局部更改功能的x。如何从该函数更改myPackage::x 例如: x <- list() populate_list <- function() { x["a"] <- 4 } 我用以下方法在R中测试它: > library(devtools) > load_all("mypackage") Loading mypackage > mypackage::test_cache() $`4-1-6-5-9-3

如何从同一个包中的函数访问包变量

以下代码仅局部更改功能的
x
。如何从该函数更改
myPackage::x

例如:

x <- list()
populate_list <- function() {
    x["a"] <- 4
}
我用以下方法在R中测试它:

> library(devtools)
> load_all("mypackage")
Loading mypackage
> mypackage::test_cache()
$`4-1-6-5-9-3-10-2-7-8`
[1] 1

> mypackage::test_cache()
$`6-9-7-10-5-1-4-2-3-8`
[1] 1

> mypackage::cache
list()
对于
mypackage::cache
和第二次运行
mypackage::test_cache()
,我希望此列表作为输出:

$`4-1-6-5-9-3-10-2-7-8`
[1] 1

$`6-9-7-10-5-1-4-2-3-8`
[1] 1
请看下面的图片。它允许您直接从特定环境中提取变量,而不是依赖于当前方法的词法范围

的文档应该有助于使这个论点变得更加清晰,尽管在不了解场景的情况下很难确定确切的语法


一般来说,如果您知道要更全局地访问变量,那么通过在本地范围定义变量来隐藏变量不是一个好主意。

我应该提供哪个环境<我不明白你在局部范围内定义变量是什么意思。你建议我如何解决这个问题?我需要一个“包全局”,可以从包中的函数修改。该变量用于缓存函数中执行的一些昂贵操作。如果您作为包编写器处理此问题,您应该能够定义该函数并在需要的任何位置使用它,只要您不使用相同的变量名定义其他内容。你能用一个更全面的例子来更新你的问题吗?我用一个更全面的例子来更新你的问题,说明发生了什么,我想发生什么。试着把
cache
作为一个环境-你在修改行为时遇到了R的默认副本。你还在测试缓存功能。如果删除与第一个示例类似的行
cache@RobGevers,会发生什么?那么变量就不会在“包”范围内被修改。看起来你是在混合包范围和函数范围。如果缓存线在包的作用域之外,并且您希望创建变量,然后让这些函数使用它,那么您需要按照@Hadley的建议传递一个环境,然后使用我在回答中指出的get方法告诉它,该环境就是您希望变量作用域的环境。@RobGevers对不起,我对环境不熟悉,不太了解。是的,我想从功能范围访问包范围。仅用于该函数的static也可以工作。如果我创建了一个带有
cache
的环境,并传递了该环境,那么我就不能从一开始就传递“cache”吗?
$`4-1-6-5-9-3-10-2-7-8`
[1] 1

$`6-9-7-10-5-1-4-2-3-8`
[1] 1
x <- list()
populate_list <- function() {
    x["a"] <<- 4
}
cache <- list()
test_cache <- function(){
    cache[[paste(sample.int(10),collapse="-")]] <<- 1
    return(cache)
}