使用dplyr的函数传入数值参数返回空数据框,如何正确传参?
如何在使用dplyr的自定义函数中正确传入数值参数?
我太懂这个坑了!你遇到的问题本质是dplyr的非标准求值(NSE)特性导致的:当你在filter()里写padj < pvalue时,dplyr默认会去数据框df里找名为pvalue的列,而不是你传入的函数参数——这就解释了为啥手动硬编码0.01能正常工作,传参数就返回空数据框。
下面给你几种靠谱的解决方法,按推荐程度排序:
推荐方法:用{{ }}(大括号占位符)处理非标准求值
这是dplyr 0.7.0及以上版本官方推荐的写法,专门用来在自定义函数中传递外部变量,语法简洁又直观:
filter_results <- function(result, pvalue){ df <- as.data.frame(result) df <- df %>% filter(!is.na(padj)) %>% filter(padj < {{ pvalue }}) # 用{{ }}把参数包起来 return(df) }
调用的时候直接传数值就行:
dds_res_filtered_pvalue <- filter_results(dds_res_simple, 0.01)
备选方法1:用.env代词明确指定变量来源
你可以用.env代词告诉dplyr:pvalue是来自函数环境的变量,不是数据框里的列:
filter_results <- function(result, pvalue){ df <- as.data.frame(result) df <- df %>% filter(!is.na(padj)) %>% filter(padj < .env$pvalue) return(df) }
备选方法2:使用标准求值版本filter_()(适配旧版dplyr)
如果你的dplyr版本比较老(低于0.7.0),可以用带下划线的标准求值函数filter_(),把过滤条件写成公式:
filter_results <- function(result, pvalue){ df <- as.data.frame(result) df <- df %>% filter(!is.na(padj)) %>% filter_(~ padj < pvalue) return(df) }
不管用哪种方法,调整后再调用函数就能得到正确的过滤结果啦!
内容的提问来源于stack exchange,提问作者nhaus
相关产品推荐
相关产品推荐

