首页 > 解决方案 > 在 R 函数中打印列的文字名称?

问题描述

我对 R 比较陌生,并试图创建一个函数来应用于我想为其生成频率表的变量名列表。但是,我编写的函数会打印函数的局部变量名称,而不是变量的实际名称。

create_tabyls <- function(df,col_name) {
result <- tabyl(df[[col_name]]) %>%
        adorn_pct_formatting() %>%
        adorn_totals()

print(result)
}

然后当我调用我的函数时:

create_tabyls(df,'AGE')

我得到:

df[[col_name]]       n percent valid_percent
1   43141    3.5%          3.7%
2  810172   66.4%         69.7%
3  309058   25.3%         26.6%
<NA>   57246    4.7%             -
Total 1219617       -             -

我不明白为什么我的输出打印为 df[[col_name]] 而不是 df[[AGE]]。谁能帮我弄清楚我犯了什么错误?我试图让它打印我给函数的实际值,而不仅仅是打印函数变量的名称。

谢谢你的帮助!

标签: rfunctiondataframepipejanitor

解决方案


我们可以转换为symbol 并评估 ( !!),因为输入是一个字符串

library(janitor)
library(dplyr)
create_tabyls <- function(df,col_name) {

   df %>%
       select(col_name) %>%
        tabyl(!! rlang::sym(col_name)) %>%
        adorn_pct_formatting() %>%
        adorn_totals()


}

-测试

data(mtcars)
mtcars$vs <- as.character(mtcars$vs)
create_tabyls(mtcars, 'vs')
#    vs  n percent
#     0 18   56.2%
#     1 14   43.8%
# Total 32       -

或者,如果我们使用不带引号的列名作为输入,那么我们可以使用 curly-curly 运算符 ( {{}})

create_tabyls <- function(df,col_name) {

   df %>%       
        tabyl({{col_name}}) %>%
        adorn_pct_formatting() %>%
        adorn_totals()


}

create_tabyls(mtcars, vs)
#  vs  n percent
#     0 18   56.2%
#     1 14   43.8%
# Total 32       -

或者,如果我们需要两个选项,即字符串或不带引号的名称,那么ensym使用!!

create_tabyls <- function(df,col_name) {

   df %>%

        tabyl(!! rlang::ensym(col_name)) %>%
        adorn_pct_formatting() %>%
        adorn_totals()


}

create_tabyls(mtcars, 'vs')
create_tabyls(mtcars, vs)

推荐阅读