"按原样"返回公式参数

  • 本文关键字:参数 返回 按原样 r
  • 更新时间 :
  • 英文 :


假设我有一个这样的函数:

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()中,然后使用.():早期评估formuladata

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创建

最新更新