如何在R函数中注入命名参数?以ggpubr的ggline为例
解决ggpubr::ggline命名参数复用问题
当调用ggpubr::ggline时仅x参数不同,其余参数固定,尝试用!!!注入参数列表未生效时,可采用以下几种可靠方法:
方法1:使用do.call
do.call是R基础包中的函数,可将列表形式的参数传递给目标函数,结合管道使用时需明确指定data参数:
library(ggpubr) # 定义固定参数列表 params <- list(y = "avg_salary", color = 'approach', add = 'mean') # 调用ggline,动态传入x参数 df %>% {do.call(ggline, c(list(data = ., x = "month"), params))} df %>% {do.call(ggline, c(list(data = ., x = "day"), params))} df %>% {do.call(ggline, c(list(data = ., x = "week"), params))}
这里用{}包裹代码块,是为了避免管道默认将df传递给do.call的第一个参数,确保df被正确传入ggline的data参数。
方法2:使用purrr::invoke
purrr包的invoke函数专门用于处理带参数列表的函数调用,语法更简洁:
library(ggpubr) library(purrr) params <- list(y = "avg_salary", color = 'approach', add = 'mean') df %>% invoke(ggline, x = "month", .args = params) df %>% invoke(ggline, x = "day", .args = params) df %>% invoke(ggline, x = "week", .args = params)
invoke会自动将管道传来的df作为ggline的第一个参数(即data),再合并x参数与.args中的固定参数。
方法3:使用rlang::exec(支持!!!语法)
如果偏好使用rlang的准引用语法,需先加载rlang包,再用exec函数展开参数列表:
library(ggpubr) library(rlang) params <- list(y = "avg_salary", color = 'approach', add = 'mean') df %>% exec(ggline, x = "month", data = ., !!!params) df %>% exec(ggline, x = "day", data = ., !!!params) df %>% exec(ggline, x = "week", data = ., !!!params)
关于原!!!写法失效的说明
原代码中!!!未生效,大概率是因为没有加载rlang包(!!!是rlang提供的语法)。若加载rlang后仍失效,可能是ggline的参数处理逻辑与准引用语法存在兼容问题,此时上述三种方法均可替代。
内容的提问来源于stack exchange,提问作者Philipp Chapkovski
相关产品推荐
相关产品推荐

