假设我有一个这样的函数:
my_lm <- function(formula, data) {
lm(formula, data)
}
my_lm(Sepal.Length ~ Sepal.Width, iris)
我希望它能返回这样的东西:
Call:
lm(formula = Sepal.Length ~ Sepal.Width, data = iris)
Coefficients:
(Intercept) Sepal.Width
6.5262 -0.2234
但相反,它返回的是:
Call:
lm(formula = t, data = data)
Coefficients:
(Intercept) Sepal.Width
6.5262 -0.2234
我该如何做到这一点?我假设涉及非标准的评估或环境,但模糊和挥手是我能提供的最好的答案。
也许最简单的方法是破解模型的$call
元素的相关组件。公式很简单,因为公式已经是未求值/符号对象。要获得data
的正确结果,您需要substitute(data)
:
my_lm <- function(formula, data) {
m <- lm(formula, data)
m$call$formula <- formula
m$call$data <- substitute(data)
m
}
my_lm(Sepal.Length ~ Sepal.Width, iris)
## Call:
## lm(formula = Sepal.Length ~ Sepal.Width, data = iris)
##
## Coefficients:
## (Intercept) Sepal.Width
## 6.5262 -0.2234
我们可以将函数体封装在eval(bquote())
中,将data
封装在substitute()
中,然后使用.()
:早期评估formula
和data
my_lm <- function(formula, data) {
eval(bquote(
lm(.(formula),
.(substitute(data))
)
))
}
}
my_lm(Sepal.Length ~ Sepal.Width, iris)
#>
#> Call:
#> lm(formula = Sepal.Length ~ Sepal.Width, data = iris)
#>
#> Coefficients:
#> (Intercept) Sepal.Width
#> 6.5262 -0.2234
由reprex包(v0.3.0(于2022-10-01创建