Использование lapply с функцией parse () - PullRequest
0 голосов
/ 04 мая 2018

Я хочу parse() просмотреть список условий, используя lapply, чтобы затем иметь возможность использовать их в качестве фильтра для набора данных. Рассмотрим это, например:

library(ggplot2)
argList <- list(c("mpg"), "manufacturer == \"audi\" ", "year > 2002")
argList <- lapply(argList, FUN = parse, text = argList)
data <- do.call(filter, argList)

Функция parse() принимает аргумент text = " " для ввода, представляющий строку символов для анализа. Я не могу заставить lapply() использовать каждый элемент списка вместо всего списка. Действительно, lapply(argList, FUN = parse, text = argList) возвращает

[[1]]
expression(mpg, manufacturer == "audi", year > 2002)

[[2]]
expression(mpg, manufacturer == "audi", year > 2002)

[[3]]
expression(mpg, manufacturer == "audi", year > 2002)

вместо

[[1]]
mpg

[[2]]
manufacturer == "audi"

[[3]]
year > 2002

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Мы также можем использовать parse_expr из rlang

library(tidyverse)
library(rlang)
do.call(filter, map(argList, parse_expr))
# A tibble: 9 x 11
#  manufacturer model      displ  year   cyl trans drv     cty   hwy fl    class
#  <chr>        <chr>      <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
#1 audi         a4           2    2008     4 manu… f        20    31 p     comp…
#2 audi         a4           2    2008     4 auto… f        21    30 p     comp…
#3 audi         a4           3.1  2008     6 auto… f        18    27 p     comp…
#4 audi         a4 quattro   2    2008     4 manu… 4        20    28 p     comp…
#5 audi         a4 quattro   2    2008     4 auto… 4        19    27 p     comp…
#6 audi         a4 quattro   3.1  2008     6 auto… 4        17    25 p     comp…
#7 audi         a4 quattro   3.1  2008     6 manu… 4        15    25 p     comp…
#8 audi         a6 quattro   3.1  2008     6 auto… 4        17    25 p     mids…
#9 audi         a6 quattro   4.2  2008     8 auto… 4        16    23 p     mids…

данные

argList <- list(c("mpg"), "manufacturer == \"audi\" ", "year > 2002")
0 голосов
/ 04 мая 2018

Это потому, что вы передаете все argList в parse() и не используете значение, переданное через lapply. Также вам нужно будет распаковать выражение, чтобы получить вызов. Попробуйте

argList <- lapply(argList, FUN = function(x) parse(text=x)[[1]])
argList
# [[1]]
# mpg
# 
# [[2]]
# manufacturer == "audi"
# 
# [[3]]
# year > 2002
...