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

R语言中如何向参数实现非标准评估的函数传递变量

R非标准评估参数的函数封装问题及解决方案

问题描述

我想要封装一个来自R包的函数,从源码来看它的部分参数实现了非标准评估。我该如何编写自己的函数,将值传入这个实现了非标准评估的参数?

示例函数逻辑

下面是模拟的目标R包函数实现,和heatwaveR包exceedance函数的非标准评估逻辑一致:

data <- data.frame(name = 1:10)
# 模拟R包中的目标函数,使用了非标准评估
toy.fun <- function(dat, var) {
    eval(substitute(var), dat)
}
# 直接调用可以正常执行
> toy.fun(data, name)
 [1]  1  2  3  4  5  6  7  8  9 10

错误封装示例

最初的封装尝试会触发变量找不到的报错:

toy.fun2 <- function(dat, var2) {
    var_name <- deparse(substitute(var2))
    # 模拟业务场景中的数据筛选操作
    data_subset <- dat[var_name] 
    toy.fun(data_subset, var2)
}
> toy.fun2(data, name)
 Error in eval(substitute(var), dat) : object 'var2' not found

需求说明

我希望在包装函数中通过var2传入不同的变量名,这样当数据中存在不同变量名时,可以同时用该名称完成数据筛选,以及传入我要封装的目标函数。

解决方案

只需将包含参数的完整函数调用替换后再求值即可解决问题,最终实现代码如下:

toy.fun2 <- function(dat, var2) {
  var_name <- deparse(substitute(var2))
  # 模拟业务场景中的数据筛选操作
  data_subset <- dat[var_name]
  exprs <- substitute(toy.fun(data_subset, var2))
  eval(exprs, parent.frame()) 
  # 若要在data.table中运行该逻辑,可补充传入envir参数
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:45:06