选择函数中数据框的不带引号的列名

Posted

技术标签:

【中文标题】选择函数中数据框的不带引号的列名【英文标题】: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'

谁能帮帮我?

【问题讨论】:

【参考方案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)

【讨论】:

以上是关于选择函数中数据框的不带引号的列名的主要内容,如果未能解决你的问题,请参考以下文章

怎样区分JS的函数中参数带引号与不带引号?

R-函数备忘

用于 ggplot2 的不带科学记数法的 R 标记中的 cut 函数

JavaScript对于switch语句中的case后键入值的带不带引号

print()函数与转义字符

使用 CodeIgniter Active Record 函数将子句添加到不带引号的 MySQL 语句