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

时间:2012-11-19 12:36:23

标签: r scope

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

以下代码仅在本地更改x函数。如何从该功能更改myPackage::x

示例:

x <- list()
populate_list <- function() {
    x["a"] <- 4
}

-

以下是我用get对此进行测试的完整代码。每次运行包时,cache键都被选择为不同。这是包裹代码,位于R/get_obj.R

cache <- list()
test_cache <- function(){
    cache <- get("cache")
    cache[[paste(sample.int(10),collapse="-")]] <- 1
    return(cache)
}

我用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

2 个答案:

答案 0 :(得分:2)

<<-运算符在父环境中搜索现有定义,因此以下内容为我提供了我想要的内容:

x <- list()
populate_list <- function() {
    x["a"] <<- 4
}

或者换另一个例子:

cache <- list()
test_cache <- function(){
    cache[[paste(sample.int(10),collapse="-")]] <<- 1
    return(cache)
}

答案 1 :(得分:0)

看看get method。它允许您直接从特定环境中提取变量,而不是依赖于当前方法的词法范围。

environments的文档应该有助于使这个论点变得更清楚,尽管在不知道场景的情况下很难识别确切的语法。

一般情况下,如果您知道自己希望更全面地访问变量,那么通过在本地范围内定义变量来隐藏变量并不是一个好主意。