我们不能将管道链输出传递给线性模型 lm() 点占位符吗?

Can we not pass pipe chain output into linear model lm() dot placeholder?

我想知道如何将管道操作的输出直接传递到 lm()

例如,我可以将下面的 yay 向量直接传递给 lm()

set.seed(40)
yay = c(rnorm(15), exp(rnorm(15)), runif(20, min = -3, max = 0))
lm(yay~1)

#> Call:
#> lm(formula = yay ~ 1)

#> Coefficients:
#> (Intercept)  
#>    -0.09522  

但是当我尝试这样的操作时,它抛出了一个错误。

library(tidyverse)
library(palmerpenguins)

data("penguins")

filter_penguins <- penguins %>% filter(species == "Adelie") 

filter_penguins %>% 
  filter(island == "Torgersen") %>% 
  select(bill_length_mm) %>%
  pull() %>% 
  lm(. ~ 1)

#> Error in formula.default(object, env = baseenv()) : invalid formula

我还尝试将 pull() 输出保存到对象中,然后将其输入到 lm(),它有效。但是为什么点占位符不能这样工作?

非常感谢。

编辑:我意识到我误读了这个问题,并认为 OP 想将变量名作为公式的一部分传递,而不是传递数据集本身。无论如何,我会把这个 post 留在原处。

它不会工作,因为 lm 的第一个参数将是管道输入的任何内容,这不是正确的公式(如错误提示的那样)。

使用你的例子,假装管道值是“var”,然后

"var" %>% 
    lm(. ~ 1)

会被评估为

lm(formula = "var", . ~ 1)

所以 . ~ 1 部分不是公式参数的一部分。不过,您可以使用 paste0 或类似的方法构建公式。例如,这会起作用:

"mpg" %>%
    paste0(" ~ .") %>%
    lm(data = mtcars)

此问题是管道内的 lm() 将给定的数据视为 formula 参数。因此,数据放错了地方。尝试:

filter_penguins %>% 
  filter(island == "Torgersen") %>% 
  select(bill_length_mm) %>%
  lm(data = ., pull(.) ~ 1)