2012-11-19 167 views
1

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

以下代码仅将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 3与:

> 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::cachemypackage::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 
+1

试着做'cache'的环境 - 您正在运行R的默认修改拷贝行为。 – hadley

+0

您还在test_cache函数内部定义了一个名为cache的局部变量。如果你删除了一行'cache <-get(“cache”)'会发生什么,但剩下的部分是一样的?您可能仍然需要使用缓存环境,因为方法内部的更改将导致如上所述复制该值。 –

+0

@RobGevers与第一个例子中的内容类似吗?然后该变量不在“包”范围内修改。 – Andreas

回答

2

<<-操作搜索父环境中的现有定义,所以下面给我我想要的东西:

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

或者为其他例如:

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

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

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

一般来说,如果您知道您希望在全局范围内访问它们,通过在本地范围内定义它们来隐藏变量并不是一个好主意。

+0

我应该提供哪种环境?'x < - get(“x”)'不会抛出错误,但似乎也找不到正确的变量。 – Andreas

+0

我不明白你在本地范围内定义变量的含义。你如何建议我解决问题呢?我需要一个可以从包中的函数修改的“全局包”。该变量用于缓存在该函数中完成的一些昂贵的操作。 – Andreas

+0

如果您正在将此问题作为软件包编写器工作,那么只要您没有使用相同的变量名称定义其他内容,就应该可以定义该函数并将其用于任何需要的地方。你能用更彻底的例子来更新你的问题吗? –