自定义R函数sample_size_finder返回0,内部代码单独运行结果正确的问题求助
解决你的tidyverse函数参数问题
嘿Matthias,别发愁啦!你遇到的这个问题其实是tidyverse里非标准求值(NSE)的典型小坑,很多刚接触R和tidyverse的朋友都会踩进去~
问题出在哪?
你原来的函数里,当传入字符串参数"team_size"给variable时,filter(variable == value)这一行其实是在做字符串"team_size"和数值4的比较,而不是去匹配数据框里team_size列的数值。这当然会返回0啦!但你单独运行代码时,直接写team_size == 4,tidyverse能自动识别这是数据框的列名,所以结果正确。
两种解决方案,任你选:
方案1:用{{ }}(大括号插值),调用时不用加引号
这种方法适合直接传入列名(不用字符串),修改后的函数如下:
sample_size_finder <- function(variable, value){ df %>% select({{variable}}) %>% filter({{variable}} == value) %>% count() }
调用的时候直接写:
sample_size_finder(team_size, 4)
{{ }}会帮你把函数参数里的variable转换成tidyverse能识别的列名,完美解决问题~
方案2:用.data代词,支持传入字符串参数
如果你想保持调用时传入字符串(比如"team_size"),可以用.data代词来明确指定是数据框里的列:
sample_size_finder <- function(variable, value){ df %>% select(.data[[variable]]) %>% filter(.data[[variable]] == value) %>% count() }
现在调用sample_size_finder("team_size", 4)就能得到正确的n=12啦!
额外小提示
其实你还可以简化函数,不用select也能得到一样的结果:
# 对应方案1的简化版 sample_size_finder <- function(variable, value){ df %>% filter({{variable}} == value) %>% count() } # 对应方案2的简化版 sample_size_finder <- function(variable, value){ df %>% filter(.data[[variable]] == value) %>% count() }
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

