为什么不将赋值()赋值给R中的列表元素呢?

时间:2012-03-05 02:50:04

标签: r list assign

我正在尝试在列表中的对象中使用赋值。我想做的是改变一些元素。例如:

x <- list()
x$test <- 1
assign("x$test", 2)
x$test == 1
     [1] TRUE

有什么想法?我需要使用assign,因为我正在构建一个函数,它将列表(x)中的对象的名称作为输入。

4 个答案:

答案 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=""))命令在此上下文中非常有用。

此致