为在 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] ""
我有一个嵌套列表索引的数据框,它被存储为字符串。举个简单的例子:
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] ""