如果我创建一个包含列表的环境,并希望为该列表指定值,那么在使用assign
和res <- 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}}
答案 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
因此,您可能无法使用get
或assign
进行作业。 get
不会允许它,因为它不是替代函数而且?分配提及:
assign不调度赋值方法,因此不能用于设置向量,名称,属性等元素。
因此,您可以使用普通的[[<-
分配方法。 @Frank在评论中提供了一个很好的方式:
res[[ "calls" ]][[ res[["counter"]] ]] <- 2