假设我想使用list.select
包中的rlist
函数来选择两个字段。
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, score)
我想使用此列表,但是不起作用:
param <- c("type", "score")
list.select(x, param)
答案 0 :(得分:0)
不确定如何使用list.select
来做到这一点,但这是一个purrr
解决方案:
library(purrr)
param <- c("type", "score")
map(x, `[`, param)
这显然也适用于lapply
:
lapply(x, `[`, param)
但是如果您有更深层的列表嵌套列表,请使用modify_depth
:
modify_depth(x, 1, `[`, param)
可以调整.depth
自变量以深入层次结构。
输出:
$p1
$p1$type
[1] "A"
$p1$score
$p1$score$c1
[1] 10
$p1$score$c2
[1] 8
$p2
$p2$type
[1] "B"
$p2$score
$p2$score$c1
[1] 9
$p2$score$c2
[1] 9
$p3
$p3$type
[1] "B"
$p3$score
$p3$score$c1
[1] 9
$p3$score$c2
[1] 7
答案 1 :(得分:0)
这是使用eval(parse(.))
的骇人听闻的方式,但结果与您的解决方案不同。碎片在那里。
> str(list.select(x, do.call(c, sapply(param, FUN = function(x) eval(parse(text = x))))))
List of 3
$ p1:List of 1
..$ :List of 3
.. ..$ type : chr "A"
.. ..$ score.c1: num 10
.. ..$ score.c2: num 8
$ p2:List of 1
..$ :List of 3
.. ..$ type : chr "B"
.. ..$ score.c1: num 9
.. ..$ score.c2: num 9
$ p3:List of 1
..$ :List of 3
.. ..$ type : chr "B"
.. ..$ score.c1: num 9
.. ..$ score.c2: num 7
> str(list.select(x, type, score))
List of 3
$ p1:List of 2
..$ type : chr "A"
..$ score:List of 2
.. ..$ c1: num 10
.. ..$ c2: num 8
$ p2:List of 2
..$ type : chr "B"
..$ score:List of 2
.. ..$ c1: num 9
.. ..$ c2: num 9
$ p3:List of 2
..$ type : chr "B"
..$ score:List of 2
.. ..$ c1: num 9
.. ..$ c2: num 7