13

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

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

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

4

4 回答 4

15

看来你运气不好。从帮助文件:

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

请注意,分配给附加列表或数据框会更改附加副本而不是原始对象:请参阅“附加”和“与”。

如果您names(x)作为输入传递,您不能使用:

nms <- names(x)
for ( n in nms )
    x[[n]] <- 'new_value'

另外,您是否打算让您的函数修改一些全局变量?例如:

x <- list(test=1)

f <- function(...)
   x$test <- 2

f() # want x$test = 2 ??

因为这不起作用(范围问题)。您可以通过一些步法<<-

如果您可以举例说明您为什么需要此功能/它将用于什么目的,我们可以帮助您找到替代解决方案。

于 2012-03-05T02:57:02.437 回答
11

看看当你分配给“x$test”时会发生什么:

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

"x" 中的元素 "test" 仍然是 1,并且您将其提取为x$testbutget("x$test")将是该名称中的值 2。

为什么不直接使用名称?IE

this.name <- "test"
x[[this.name]] <- 2
于 2012-03-05T02:58:01.810 回答
2

另一种解决方案是:

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=""))命令在这种情况下非常有用。

真挚地

于 2012-03-18T18:32:44.123 回答
1

你试过 <<- 吗?我昨天用它在一个帖子中的函数中为列表分配名称和值(请参阅“组合一系列数据框并为每个数据框创建新列”)。

于 2012-03-05T03:08:54.200 回答