解析一个字符串来代替表达式参数

时间:2015-03-19 19:08:46

标签: r metaprogramming

我想在rlist包中将表达式作为参数发送到函数list.select

函数list.select的正常使用如下:

x <- list(p1 = list(type='A',score=list(c1=10,c2=8)), p2 = list(type='B',score=list(c1=9,c2=9)), p3 = list(type='B',score=list(c1=9,c2=7)))
list.select(x, type)

type是所选列表元素的名称。我想通过使列表元素的名称从字符串解析来参数化列表元素的名称。

list.select(x, parse(text='type'))

但这不起作用。以下是两个函数调用的结果:

> list.select(x, type)
$p1
$p1$type
[1] "A"
$p2
$p2$type
[1] "B"
$p3
$p3$type
[1] "B"
> list.select(x, parse(text='type'))
$p1
$p1[[1]]
expression(type)
$p2
$p2[[1]]
expression(type)
$p3
$p3[[1]]
expression(type)

如何使用字符串代替表达式?

1 个答案:

答案 0 :(得分:3)

list.select执行非标准评估,因此您需要为其构建调用。这是一个例子:

tag.name <- "type"
eval(call("list.select", x, as.name(tag.name)))

产地:

$p1
$p1$type
[1] "A"


$p2
$p2$type
[1] "B"


$p3
$p3$type
[1] "B"

我做什么和做什么之间的区别在于我构建整个调用以避免让list.select有机会错误地解释它的参数。您的版本首先评估list.select,从那时起您就可以list.select想要解释其论点。