如何在无参数内部函数中捕获父函数的...参数做有效性校验
捕获父函数的省略号参数进行校验
要实现从无参数的内部函数中获取父函数的...参数并做有效性校验,你可以借助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
相关产品推荐
相关产品推荐

