R语言自定义函数是否可忽略指定参数实现无过滤绘图
问题澄清
特此说明:本人无意重开已有问题,后续将单独发布跟进问题,本问题核心边界如下:
- 本问题不涉及dplyr包中ifelse函数的使用相关内容
- 本问题聚焦自定义函数的参数传参逻辑,该需求存在特定未详述的重要应用场景
原问题描述
本人基于R内置mtcars数据集编写了如下自定义函数,核心逻辑为先按指定条件过滤数据框,再调用ggplot2绘制柱状图:
# 自定义函数 my_function <- function(df, x, y, z) { df %>% filter(am == z) %>% ggplot(aes(x = {{x}}, y={{y}}))+ geom_col() }
目前函数传参运行情况如下:
- 传入过滤参数
z=0(即筛选am==0的子集):调用my_function(mtcars, cyl, mpg, 0)可正常运行 - 传入过滤参数
z=1(即筛选am==1的子集):调用my_function(mtcars, cyl, mpg, 1)可正常运行
现需求为:调用函数时省略过滤参数z,直接绘制未经过滤的全量数据图表,但执行my_function(mtcars, cyl, mpg)时触发如下报错:
Error in `filter()`: ! Problem while computing `..1 = am == z`. Caused by error: ! argument "z" is missing, with no default
现咨询如何实现自定义函数中跳过/忽略该过滤参数的需求。
解决方案
核心思路是把固定执行的过滤逻辑改为条件触发:仅当用户传入z参数时才执行子集筛选,未传参时直接跳过过滤步骤使用全量数据绘图,两种可直接运行的实现方式如下:
方式1:用missing()判断参数是否缺失
不需要给z设置默认值,直接通过R原生的missing()函数检测调用时是否传入了z参数,代码如下:
library(tidyverse) my_function <- function(df, x, y, z) { # 仅当z被传入时才执行过滤 if (!missing(z)) { df <- df %>% filter(am == z) } df %>% ggplot(aes(x = {{x}}, y = {{y}})) + geom_col() }
方式2:给z设置NULL默认值
给z设置默认值为NULL,通过判断参数是否非空决定是否执行过滤,代码如下:
library(tidyverse) my_function <- function(df, x, y, z = NULL) { # 仅当z不为空时才执行过滤 if (!is.null(z)) { df <- df %>% filter(am == z) } df %>% ggplot(aes(x = {{x}}, y = {{y}})) + geom_col() }
两种写法效果完全一致:
- 传入
z=0/z=1时,函数行为和修改前无差异,正常输出对应子集的柱状图 - 省略
z参数调用时,直接跳过filter步骤,使用全量数据绘图,不会触发参数缺失报错。
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

