【问题标题】:Using lapply with parse() function将 lapply 与 parse() 函数一起使用
【发布时间】:2018-05-04 14:50:29
【问题描述】:

我想通过使用 lapply 的条件列表parse(),然后能够将它们用作数据集的过滤器。例如考虑一下:

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

【问题讨论】:

  • 也许你想要foo &lt;- function(x) parse(text = x) 而不是parse 本身,因为text 不是parse 的第一个参数。
  • lapply(argList, function(x) parse(text = x)) 怎么样?

标签: r lapply


【解决方案1】:

这是因为您将整个argList 传递给parse(),而不是使用通过lapply 传递的值。此外,您还需要拆箱表达式才能接听电话。试试

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

【讨论】:

    【解决方案2】:

    我们也可以使用rlang中的parse_expr

    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")
    

    【讨论】:

    • 感谢这个非常优雅的解决方案,尽管与我最初想到的有点不同!奇怪的是,tidyverse 似乎并不总是导入 rlang,因此要使其正常工作,您可能必须加载 library(rlang)first。
    猜你喜欢
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 2012-11-16
    相关资源
    最近更新 更多