R 在环境中指定列表属性

R 在环境中指定列表属性,r,environment,R,Environment,标题是一个独立的问题。一个例子说明了这一点:考虑 x=list(a=1, b="name") f <- function(){ assign('y[["d"]]', FALSE, parent.frame() ) } g <- function(y) {f(); print(y)} g(x) $a [1] 1 $b [1] "name" 几句话。我知道我最初的例子有什么不对,但我用它来明确我的目标。我想避免赋值的第一个参数必须是变量名,而不是表达式的字符表示形式。尝试

标题是一个独立的问题。一个例子说明了这一点:考虑

x=list(a=1, b="name")
f <- function(){
    assign('y[["d"]]', FALSE, parent.frame() )
}
g <- function(y) {f(); print(y)}

g(x)

$a
[1] 1

$b
[1] "name"

几句话。我知道我最初的例子有什么不对,但我用它来明确我的目标。我想避免赋值的第一个参数必须是变量名,而不是表达式的字符表示形式。尝试将
f
替换为:

f <- function() with(parent.frame(), y$d <- FALSE)

另外,请注意,根据您想要执行的操作,将
x
作为一个环境或一个proto对象(来自proto包)可能(也可能不是)更好。

assign
的第一个参数需要是一个对象名。您对
assign
的使用基本上和assign帮助页面末尾的反例相同。注意:

> x=list(a=1, b="name")
> f <- function(){
+     assign('x["d"]', FALSE, parent.frame() )
+ }
> g <- function(y) {f(); print(`x["d"]`)}
> g(x)
[1] FALSE   # a variable with the name `x["d"]` was created
>x=list(a=1,b=“name”)
>f g(x)
[1] FALSE#已创建名为'x[“d”]`的变量

这可能是您想要使用的地方“这不是你想做什么?在当前范围之外修改变量通常是一个非常糟糕的主意。我试图避免将一个非常大的对象按值传递给一个重复调用的函数。该函数还修改对象的一部分。在任何语言中都不建议使用静态全局变量,但有时会很有用。您分析过对象的传递并发现这是一个问题吗?R不会复制对象,除非你修改它,不管你在这里做什么。这种更复杂的方法是否真的能节省时间并不明显。
f <- function() with(parent.frame(), attr(y, "d") <- FALSE)
> x=list(a=1, b="name")
> f <- function(){
+     assign('x["d"]', FALSE, parent.frame() )
+ }
> g <- function(y) {f(); print(`x["d"]`)}
> g(x)
[1] FALSE   # a variable with the name `x["d"]` was created
> f <- function(){
+     x$d <<- FALSE
+ }
> g <- function(y) {f(); print(y)}
> g(x)
$a
[1] 1

$b
[1] "name"

$d
[1] FALSE
> f <- function(){
+     assign('y', c(x, d=FALSE), parent.frame() )
+ }
> g <- function(y) {f(); print(y)}
> g(x)
$a
[1] 1

$b
[1] "name"

$d
[1] FALSE

> x    # `x` is unchanged
$a
[1] 1

$b
[1] "name"