保留公式参数“as is”

5

假设我有这样一个函数:

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 

我该如何实现这一功能?我猜测可能涉及到非标准的评估或环境,但是模糊和含糊不清的回答就像我能提供的一样好。

2个回答

7
也许最简单的方法是攻击模型的 $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  

4
我们可以将函数体用eval(bquote())包裹起来,将datasubstitute()包裹起来,然后使用.()提前评估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 package (v0.3.0) 于2022年10月01日创建


1
这绝对是另一个正确的答案。我认为可能需要少量较少抽象思考(即弄清楚eval(bquote(..., substitute()))的含义... - Ben Bolker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接