在函数体中不提及函数参数如何使用?

Posted

技术标签:

【中文标题】在函数体中不提及函数参数如何使用?【英文标题】:How can a function parameter be used without mentioning it in the function body? 【发布时间】:2010-10-20 23:31:39 【问题描述】:

我一直在尝试更多地了解 R(以及编写 C 扩展),我认为阅读一些知名软件包的源代码可能会有所帮助。我决定从定义为的 rpart 开始:

rpart <- function(formula, data, weights, subset,
       na.action=na.rpart, method, model=FALSE, x=FALSE, y=TRUE,
       parms, control, cost, ...)

我对源代码进行了快速搜索,但在函数体中的任何地方都没有看到提到的公式,但我知道 rpart 以某种方式使用了该参数。 rpart 是如何使用公式而不在函数体中命名的?

【问题讨论】:

【参考方案1】:

这很棘手:

m <- match.call(expand.dots = FALSE)
# ...
m[[1L]] <- as.name("model.frame")
m <- eval(m, parent.frame())

该函数使用match.call找出它是如何被调用的,修改调用以将被调用函数替换为model.frame,并通过eval使用它收到的参数调用它(虽然我替换的部分是# ... 删除了几个参数),model.frame 使用了formula 参数。请参阅match.callevalmodel.frame 的文档,并进行一些实验,例如尝试了解这里发生了什么:

f <- function(formula, data)  
  m <- match.call()
  m[[1L]] <- as.name('model.frame')
  eval(m, parent.frame())

f(x ~ y)
Error in eval(expr, envir, enclos) : object 'x' not found
x <- c(1,2,3)
f(x ~ y)
Error in eval(expr, envir, enclos) : object 'y' not found
y <- c(3,4,5)
f(x ~ y)
  x y
1 1 3
2 2 4
3 3 5
d <- as.data.frame(matrix(c(1,2,3,4),nrow=2))
names(d) <- c('foo', 'bar')
f(foo ~ bar, d)
  foo bar
1   1   3
2   2   4

【讨论】:

以上是关于在函数体中不提及函数参数如何使用?的主要内容,如果未能解决你的问题,请参考以下文章

我如何在函数体中使用通用类型

声明带参数的函数

matlab中如何看函数结构体中的数据

包体中有两个同名但参数不同的函数是啥意思?

回调函数示例

qsort:转换比较器函数本身还是比较器函数体中的参数?