如何在R中实现可返回父函数传入参数数量的nargin函数?
实现R版
nargin()函数,复刻MATLAB同名功能 要解决你的问题,核心是要获取调用nargin()的父函数实际接收的参数数量,而不是nargin()自身的参数。你之前的尝试因为没有正确定位到父函数的调用上下文,所以始终返回0。这里给你一个可行的实现:
nargin <- function() { # 获取父函数的完整调用表达式 parent_call <- sys.call(sys.parent()) # 调用表达式的第一个元素是函数名,剩下的是传入的参数,所以长度减1 length(parent_call) - 1 }
为什么这个方案有效?
sys.parent():返回调用当前函数的父函数在调用栈中的位置,简单说就是找到是谁调用了nargin()。sys.call(sys.parent()):获取父函数的完整调用语句,比如当你运行addme(3,4)时,这个语句会返回addme(3,4)——它是一个列表结构,第一个元素是函数名addme,后面的元素是传入的参数。- 用
length(parent_call) - 1就能得到实际传入的参数数量,完美复刻MATLABnargin的行为。
用你的示例函数验证
把这个nargin()和你的addme函数配合使用:
addme <- function(a, b) { if (nargin() == 2) { c <- a + b } else if (nargin() == 1) { c <- a + a } else { c <- 0 } return(c) }
测试不同调用场景:
addme()→ 返回0(无参数传入)addme(5)→ 返回10(仅传入1个参数)addme(3, 4)→ 返回7(传入2个参数)
为什么你之前的方案失效?
你之前的代码length(as.list(match.call(envir = parent.env(environment())))),match.call默认获取的是当前函数(nargin())的调用上下文,而nargin()本身被调用时没有传入任何参数,所以始终返回0。parent.env(environment())只是切换了环境,但并没有改变match.call获取的调用对象,所以无法得到父函数的参数信息。
内容的提问来源于stack exchange,提问作者Waldir Leoncio
相关产品推荐
相关产品推荐

