我有一个函数,可以在其中使用超级评估运算符在全局环境中更新变量。只要它是单个值,就可以正常工作。
a <<- 3
但是我在数据框和数据表的子集上遇到错误,例如
a <- c(1,2,3)
a[3] <<- 4
Error in a[3] <<- 4 : object 'a' not found
有人知道为什么会这样以及如何解决吗?
谢谢!
答案 0 :(得分:3)
如果可能的话,应避免使用超级分配运算符和其他破坏范围的技术,尤其是因为这样会使代码不清晰,并使此类情况变得混乱。但是,如果确实需要为超出范围的变量分配值,则可以在eval
内使用标准分配:
a <- c(1,2,3)
eval(a[3] <- 4, envir = -1)
a
[1] 1 2 4
要对此进行进一步概括(如果在函数内部执行分配),则可能仍需要在<<-
内使用eval
。
尽管在范围之外更改变量仍然不是一个好主意,但是使用eval
至少会使操作更加明确,因为必须指定要在其中计算表达式的环境。
总而言之,突破范围的分配本身从来都不是必需的,并且您也许应该找到一种方式来编写脚本,以使其不受依赖。