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

如何在无参数内部函数中捕获父函数的...参数做有效性校验

捕获父函数的省略号参数进行校验

要实现从无参数的内部函数中获取父函数的...参数并做有效性校验,你可以借助rlang包的环境工具,直接从调用者的执行环境中提取实际传入的省略号参数。

正确实现代码

library(rlang)

check_dots <- function() {
  # 从调用者环境捕获所有...参数,转为列表
  dots <- dots_list(..., .env = caller_env())
  
  # 执行校验逻辑:如果仅传入1个参数且值为"foo"则报错
  if (length(dots) == 1L && dots[[1]] == "foo") {
    stop("仅传入单个'foo'参数,不符合要求")
  }
}

# 测试场景1:传入两个参数,校验通过
(function(...) {
  check_dots()
  "success"
})("foo", "bar")

# 测试场景2:仅传入"foo",触发报错
(function(...) {
  check_dots()
  "success"
})("foo")

核心原理说明

  • caller_env():获取当前函数的直接调用者的执行环境,也就是父函数运行时的环境,里面包含了父函数实际接收的...参数值。
  • dots_list(..., .env = caller_env()):指定从调用者环境中提取...参数,将其转换为列表格式,方便后续的长度判断和值校验。

为什么之前的方法失败

formals(caller_fn())只能获取调用者函数的形式参数定义(也就是函数声明时写的...),无法拿到实际运行时传入的参数值,因此没法用来做有效性校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:05:32