为在 R 中存储为字符串的嵌套列表的索引赋值

Assign value to indices of nested lists stored as strings in R

我有一个嵌套列表索引的数据框,它被存储为字符串。举个简单的例子:

df1 <- data.frame(x = c("lst$x$y$a", "lst$x$y$b"), stringsAsFactors = F)

这些是以下列表的坐标:

lst <- list(x=list(y=list(a="foo",b="bar",c="")))

我想使用 df1 中的索引替换值或为这些元素分配新值。

一次尝试是

do.call(`<-`, list(eval(parse(text = df1[1,1])), "somethingelse"))

但这似乎不起作用。相反,它将 "something" 分配给 foo.

我对使用 eval(parse(text=)) 不太满意(维护代码将成为一场噩梦),但认识到我可能别无选择。

欢迎任何提示。

让我们考虑 3 种情况:

案例一

do.call(`<-`, list("lst$x$y$a", "somethingelse"))

这将在您的工作区中创建一个名为 lst$x$y$a 的新变量,因此以下两个命令将调用不同的对象。 (前者是你存储在lst中的对象,后者是新变量,需要用反引号来调用,因为它的名字会混淆R。)

> lst$x$y$a   # [1] "foo"
> `lst$x$y$a` # [1] "somethingelse"

案例二

do.call(`<-`, list(parse(text = "lst$x$y$a"), "somethingelse"))

你基本上得到了你对这个的期望,但仍然出现错误:

invalid (do_set) left-hand side to assignment

让我们检查一下:

> parse(text = "lst$x$y$a")  # expression(lst$x$y$a)

属于classexpression,算子<-好像不接受这个class到左边


案例三

这个会实现你想要的:

do.call(`<-`, list(parse(text = "lst$x$y$a")[[1]], "somethingelse"))

如果把[[1]]放在expression对象后面,会抽取一个call对象在<-.

运算符中生效
> lst

# $x
# $x$y
# $x$y$a
# [1] "somethingelse"
# 
# $x$y$b
# [1] "bar"
# 
# $x$y$c
# [1] ""