You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 18:12:34