【问题标题】:R make function robust to both standard and non-standard evaluationR 使函数对标准和非标准评估都具有鲁棒性
【发布时间】:2016-04-27 15:06:36
【问题描述】:

我有一个小函数可以搜索用户定义的column 依赖于dplyr 的数据框。在下面的当前形式中,它接受非标准评估中的列参数 - 不带引号(例如,scenario 在标准评估中而不是 "scenario")。

search_column <- function(df, column, string, fixed = TRUE){
      df <- dplyr::select_(df, deparse(substitute(column)))
      df <- distinct(df)

      return(grep(string, df[[1]], fixed = fixed, value = TRUE))
    }

无论用户如何输入列名,即在标准或非标准评估中,是否有办法使函数工作?

【问题讨论】:

    标签: r dataframe dplyr nse


    【解决方案1】:

    我建议简单地删除 deparse 添加到字符串输入的额外引号,在这种情况下,它将产生相同的输出,并且您的代码将适用于任何输入

    比较 3 种可能的输入

    gsub('"', "", deparse(substitute("mpg")))
    [1] "mpg"
    gsub('"', "", deparse(substitute('mpg')))
    [1] "mpg"
    gsub('"', "", deparse(substitute(mpg)))
    [1] "mpg"
    

    因此解决方案可能是将您的第一行修改为

    df <- dplyr::select_(df, gsub('"', "", deparse(substitute(column))))
    

    【讨论】:

    • 附带说明一下,我不是一个狂热的管道迷,但你可能可以用更dplyr 惯用的方式在函数中管道你的代码——这会让 hadley 非常高兴。跨度>
    • 不确定如何在函数中使用 dplyr 管道 %&gt;%。像这样:dplyr::"%&gt;%"?
    • 一旦你加载了dplyr,你就不需要使用dplyr::,除非你想让它在不加载dplyr的情况下工作?
    • 好吧,既然我——当然——想让哈德利很开心,我就用这种方式来指代函数,因为推荐here
    • 你说得有道理。无论如何,我主要是在开玩笑——这是你的选择。
    猜你喜欢
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多