gpt4 book ai didi

r - 如何使用函数参数而不在函数体中提及它?

转载 作者:行者123 更新时间:2023-12-04 11:32:48 24 4
gpt4 key购买 nike

我一直在尝试更多地了解 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 在函数体中没有名字的情况下如何使用公式?

最佳答案

这很棘手:

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.call 的文档, eval , 和 model.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

关于r - 如何使用函数参数而不在函数体中提及它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/775116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com