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

mik*_*ike 11 r list assign

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

x <- list()
x$test <- 1
assign("x$test", 2)
x$test == 1
     [1] TRUE
Run Code Online (Sandbox Code Playgroud)

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

mat*_*fee 14

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

'assign'不调度赋值方法,因此它不能用于设置向量,名称,属性等元素.

请注意,对附加列表或数据框的分配会更改附加副本而不是原始对象:请参阅"附加"和"附带".

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

nms <- names(x)
for ( n in nms )
    x[[n]] <- 'new_value'
Run Code Online (Sandbox Code Playgroud)

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

x <- list(test=1)

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

f() # want x$test = 2 ??
Run Code Online (Sandbox Code Playgroud)

因为这不起作用(范围问题).你可以使用一些脚步(<<-),但这通常被认为是不好的做法,因为很容易将无意的错误输入你的代码.

如果您能举例说明为什么要使用此功能/它将用于何种用途,我们可以帮助您找到替代解决方案.


mds*_*ner 9

看看分配给"x $ test"时会发生什么:

x <- list()
x$test <- 1
assign("x$test", 2)
ls()
[1] "x"      "x$test"
Run Code Online (Sandbox Code Playgroud)

"x"中的元素"test"仍然是1,你用它提取它,x$test但是get("x$test")它将是该名称的值2.

为什么不直接使用这些名字?即

this.name <- "test"
x[[this.name]] <- 2
Run Code Online (Sandbox Code Playgroud)