我有一个嵌套列表索引的数据框,该列表已存储为字符串。举一个简单的例子:
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=))
不太满意(维护代码将成为一场噩梦),但是认识到我可能别无选择。
欢迎任何提示。
答案 0 :(得分:3)
让我们考虑3种情况:
案例1
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"
案例2
do.call(`<-`, list(parse(text = "lst$x$y$a"), "somethingelse"))
您基本上可以通过此工具获得期望的结果,但仍然会发生错误:
分配的左侧无效(do_set)
让我们检查一下:
> parse(text = "lst$x$y$a") # expression(lst$x$y$a)
它属于类expression
,并且运算符<-
似乎不接受此类。
案例3
这将实现您想要的:
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] ""