Как я могу передать список имен в list.select? - PullRequest
0 голосов
/ 06 сентября 2018

Предположим, я хочу использовать функцию 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)

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Это хакерский способ использования 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
0 голосов
/ 06 сентября 2018

Не уверен, как это сделать, используя 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
...