我正在尝试在列表中的对象中使用赋值。我想做的是改变一些元素。例如:
x <- list()
x$test <- 1
assign("x$test", 2)
x$test == 1
[1] TRUE
有什么想法?我需要使用assign,因为我正在构建一个函数,它将列表(x)中的对象的名称作为输入。
答案 0 :(得分:14)
看起来你运气不好。从帮助文件:
'assign'不会调度赋值方法,因此无法使用它 设置向量,名称,属性等元素。
请注意,分配给附加列表或数据框会更改 附加副本而不是原始对象:请参阅'attach'和'with'。
如果您传递names(x)
作为输入,则无法使用:
nms <- names(x)
for ( n in nms )
x[[n]] <- 'new_value'
另外,您打算让您的函数修改一些全局变量吗? e.g:
x <- list(test=1)
f <- function(...)
x$test <- 2
f() # want x$test = 2 ??
因为这不起作用(范围问题)。你可以通过一些步法(<<-
)来使它工作,但这通常被认为是不好的做法,因为很容易将无意的错误存储到你的代码中。
如果你能举例说明你为什么要这个功能/它将起什么作用,我们可以帮你找到另一种解决方案。
答案 1 :(得分:9)
查看分配到“x $ test”时会发生什么:
x <- list()
x$test <- 1
assign("x$test", 2)
ls()
[1] "x" "x$test"
“x”中的元素“test”仍为1,您使用x$test
提取它,但get("x$test")
将是该名称的值2。
为什么不直接使用这些名字?即
this.name <- "test"
x[[this.name]] <- 2
答案 2 :(得分:1)
你试过&lt;&lt; - ?我用这个来为昨天的帖子中的一个函数中的列表分配名称和值(参见"Combine a series of data frames and create new columns for data in each")。
答案 3 :(得分:1)
另一种解决方案是:
x <- list()
x$test <- 1
assign("x$test", 2)
x$test == 1
TRUE
eval(parse(text="x$test<-2"))
x$test == 1
FALSE
eval(parse(text=""))
命令在此上下文中非常有用。
此致