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

如何在dplyr 1.1.0中使用across()调用带共享参数的函数列表

使用模拟数据和函数快速设置

  • 加载dplyr包
    library(dplyr)
    
  • 创建单列数据框
    data <- data.frame(a = 1:5)
    
  • 定义两个自定义函数
    newfun1 <- function(x, val) {x + val}
    newfun2 <- function(x, val) {x * val}
    
  • 将函数存储为命名列表
    usefuns <- stats::setNames(as.list(c(newfun1, newfun2)), c("fun1", "fun2"))
    

需求目标

将usefuns中的每个函数应用到data的a列,统一指定val参数为100


旧版本(dplyr < 1.1.0)实现方式

直接通过across()的...参数传递公共参数即可:

data %>% mutate(across(.col = a, .fns = usefuns, val = 100))

dplyr 1.1.0+的兼容性问题

升级到dplyr 1.1.0及以上版本后,会收到以下警告:

自dplyr 1.1.0起,across()的...参数已被弃用。请通过匿名函数直接向.fns传递参数。
#旧写法
across(a:b, mean, na.rm = TRUE)
#新写法
across(a:b, ~mean(x, na.rm = TRUE))

已找到的可行写法

# 直接调用函数
data %>% mutate(across(.col = a, .fns = list(fun1 = ~newfun1(.x, val = 100), fun2 = ~newfun2(.x, val = 100))))

# 从命名列表调用
data %>% mutate(across(.col = a, .fns = list(fun1 = ~usefuns$fun1(.x, val = 100), fun2 = ~usefuns$fun2(.x, val = 100))))

但以上写法不够简洁——实际场景中usefuns的函数数量不固定,且可能有更多公共参数,每次都逐个写匿名函数效率太低。


补充场景

val参数值可能随应用场景变化,比如多列数据框:

data <- data.frame(a = 1:5, b = 6:10, c = 11:15)

在旧版本中可以这样批量处理:

data %>% mutate(across(.col = c(a, b), .fns = usefuns, val = 100), across(.col = c, .fns = usefuns, val = 200))

试过多种函数列表的调用方式,也尝试过purrr但效果不理想,想知道是否可以用partial()简化操作,以及具体用法。


内容的提问来源于stack exchange,提问作者Danielle Quinn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:12:23