使用lapply和parse()函数

时间:2018-05-04 14:50:30

标签: r lapply

我希望library(ggplot2) argList <- list(c("mpg"), "manufacturer == \"audi\" ", "year > 2002") argList <- lapply(argList, FUN = parse, text = argList) data <- do.call(filter, argList) 使用lapply通过条件列表,然后能够将它们用作数据集的过滤器。以此为例:

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

而不是

{{1}}

2 个答案:

答案 0 :(得分:2)

那是因为您将整个argList传递给parse()而没有使用通过lapply传递的值。此外,您还需要取消装入表达式才能接听电话。尝试

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

答案 1 :(得分:1)

我们也可以使用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")