【问题标题】:unquoted column names of a data frame in select function选择函数中数据框的不带引号的列名
【发布时间】:2019-10-02 03:38:26
【问题描述】:

我在做作业时遇到了困惑,问题如下: 如果您提供数据框的不带引号的列名,下面定义的此函数是否有效?用 3-4 句话解释为什么或为什么不。

sel <- function(x, col_names) {
select(x, col_names)}

我以虹膜数据为例:

Sepal.Length    Sepal.Width   Petal.Length   Petal.Width    Species
   5.1              3.5           1.4             0.2        setosa

我试过了

select(iris, Sepal.Length)

效果很好, 但是尝试时

sel(iris, Sepal.Length)

没用,错误信息如下:

Error in .f(.x[[i]], ...): can't find 'Sepal.Length'

谁能帮帮我?

【问题讨论】:

    标签: r


    【解决方案1】:

    未加引号的列名在函数中不起作用,一种方法是使用 rlang 中的 curly-curly ({{}}) 运算符。

    library(rlang)
    sel <- function(x, col_names) dplyr::select(x, {{col_names}})
    
    sel(iris, Sepal.Length) %>% head
    
    #  Sepal.Length
    #1          5.1
    #2          4.9
    #3          4.7
    #4          4.6
    #5          5.0
    #6          5.4
    

    它是先前enquo 的继承者并评估 (!!)

    sel <- function(x, col_names)  dplyr::select(x, !!enquo(col_names))
    

    【讨论】:

    • 谢谢,我学会了窍门。函数运行时,涉及到未加引号的列名,因未定义而被视为非法。
    【解决方案2】:

    您可以使用 rlang/tidyeval 方法,或者在这种情况下,基本 R 方法也适用于点、点、点。

    library(dplyr)
    
    sel <- function(x, ...) select(x, ...)
    
    # tests
    sel(iris, Sepal.Length)
    sel(iris, Sepal.Length, Sepal.Width)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      • 2022-01-21
      • 2016-10-13
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      相关资源
      最近更新 更多