将值分配给以字符串形式存储在R中的嵌套列表的索引

时间:2019-02-14 16:19:11

标签: r eval

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

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=))不太满意(维护代码将成为一场噩梦),但是认识到我可能别无选择。

欢迎任何提示。

1 个答案:

答案 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] ""