如何在R语言中将tabyl(x, y)封装为自定义函数?
解决自定义tabyl函数的非标准评估问题
你遇到的问题确实和非标准评估(NSE)有关,同时还有一个小细节是调用函数时的参数传递错误——你传了字符串'mtcars',但应该直接传入数据框对象mtcars。下面分两种场景给你解决方案:
场景1:直接传入变量名(无需字符串)
如果习惯像用原生tabyl那样直接写变量名,用dplyr的**curly-curly语法({{}})**就能轻松解决NSE问题,它会帮你捕获函数参数中的变量名并正确传递给tabyl:
library(dplyr) library(janitor) crTab <- function(df, v1, v2) { df %>% tabyl({{v1}}, {{v2}}) } # 调用方式和原生tabyl一致,直接传变量名 crTab(mtcars, vs, cyl) #> vs 4 6 8 #> 0 1 3 14 #> 1 10 4 0
场景2:支持传入字符串形式的变量名
如果需要用字符串传递变量名(比如动态生成变量名的场景),可以结合.data代词,它能明确告诉tabyl从输入数据框中提取对应名称的变量,兼容性更好:
crTab_str <- function(df, v1, v2) { df %>% tabyl(.data[[v1]], .data[[v2]]) } # 调用时传字符串变量名 crTab_str(mtcars, "vs", "cyl") #> vs 4 6 8 #> 0 1 3 14 #> 1 10 4 0
也可以使用all_of()实现相同效果,只要确保参数传递逻辑正确:
crTab_allof <- function(df, v1, v2) { df %>% tabyl(all_of(v1), all_of(v2)) } crTab_allof(mtcars, "vs", "cyl") #> vs 4 6 8 #> 0 1 3 14 #> 1 10 4 0
为什么你之前的代码报错?
你之前的错误有两个核心原因:
- 调用
crTab('mtcars', 'vs', 'cyl')时,第一个参数传了字符串'mtcars',而不是实际的数据框对象mtcars,导致tabyl无法识别输入类型; - 早期版本的
janitor对all_of()的语法支持存在兼容性问题,改用.data代词或curly-curly语法就能避免这类问题。
内容的提问来源于stack exchange,提问作者sbac
相关产品推荐
相关产品推荐

