В типичном случае, когда я использую map
:
out <- map(data_list, ~fo(arg1 =.))
, если fo()
возвращает вызов функции (как в out[[1]]$call
), он будет содержать arg1=.
, но этоможет вызвать проблемы, если вывод call
будет использован позже (пример ниже).Как можно вместо этого получить что-то вроде arg1=data_list[[1]]
, то есть .
оценивается (или передается, не знаю, как это назвать)?
Пример: запустить lm()
регрессии с картой, с data=.
, т.е. map(data, ~lm(f, data = .))
.Попробуйте затем обновить регрессии.Это не будет работать, так как update()
будет искать out$call$data
и найдет .
, поэтому не будет знать, где искать.
library(tidyverse)
iris_nest <- nest(as_tibble(iris), -Species)
regs <- map(iris_nest$data, ~lm(Sepal.Length ~ Sepal.Width + Petal.Length, data = .))
# update first?
update(regs[[1]], ~ . - Sepal.Width)
#> Error in is.data.frame(data): object '.' not found
## issue comes from:
regs[[1]]$call$data
#> .
Обходной путь: Обходной путь, который у меня есть, заключается в обратной связи с out$call$data
, но, надеюсь, есть лучший способ сделать это заранее, с некоторыми eval
/ get
/
# workaround:
regs[[1]]$call$data <- iris_nest$data[[1]]
update(regs[[1]], ~ . - Sepal.Width)
#>
#> Call:
#> lm(formula = Sepal.Length ~ Petal.Length, data = structure(list(
#> Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5, 5.4, 4.6, 5, 4.4,
#> 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3, 3, 4, 4.4, 3.9, 3.5, 3.8,
#> SKIP SKIP SKIP
#> 0.4, 0.3, 0.2, 0.2, 0.2, 0.2)), .Names = c("Sepal.Length",
#> "Sepal.Width", "Petal.Length", "Petal.Width"), row.names = c(NA,
#> -50L), class = c("tbl_df", "tbl", "data.frame")))
#>
#> Coefficients:
#> (Intercept) Petal.Length
#> 4.2132 0.5423