使用`get`分配到特定环境中的列表索引

时间:2015-11-20 15:31:33

标签: r

如果我创建一个包含列表的环境,并希望为该列表指定值,那么在使用assignres <- new.env() res$calls <- vector("list", 100) res$counter <- 1 ## works fine res$calls[[1]] <- 1 ## Fails, why? get("calls", envir=res)[[get("counter", envir=res)]] <- 2 ## doesnt make the assignment val <- get("calls", envir=res)[[get("counter", envir=res)]] assign("val", 2, envir=res) 时,为什么以下操作会失败?

{{1}}

1 个答案:

答案 0 :(得分:3)

我认为以下内容将解决您的问题:

get("calls", envir=res)[[get("counter", envir=res)]] <- 2失败,因为get不是replacement函数。另一方面,res$calls[[1]] <- 1实际上是一个替换函数,如果您键入help('[[<-'),就可以看到它。这是您进行作业时使用的功能。我认为get没有替代对应物(get<-)的原因是有一个特定的功能来执行此操作,称为assign(根据@TheTime&#39;评论)。

对于第二种情况,val <- get("calls", envir=res)[[get("counter", envir=res)]]是在全局环境中创建的。当您使用assign("val", 2, envir=res)时,res$val环境中会创建一个res变量,您可以在下面看到:

> res$val
[1] 2

但是,val在全局环境中与1:

保持相同
> val
[1] 1

因此,您可能无法使用getassign进行作业。 get不会允许它,因为它不是替代函数而且?分配提及:

  

assign不调度赋值方法,因此不能用于设置向量,名称,属性等元素。

因此,您可以使用普通的[[<-分配方法。 @Frank在评论中提供了一个很好的方式:

res[[ "calls" ]][[ res[["counter"]] ]] <- 2