我有一个嵌套列表索引的数据框,该列表已存储为字符串。举一个简化的例子:
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种情况:
情况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"
情况二
do.call(`<-`, list(parse(text = "lst$x$y$a"), "somethingelse"))
您基本上可以通过此工具获得期望的结果,但仍然会发生错误:
分配的左侧无效(do_set)
让我们检查:
> parse(text = "lst$x$y$a") # expression(lst$x$y$a)
它属于class 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] ""
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句