Jakieś pułapki związane z używaniem konstruowanych programowo formuł?
Chcę przejść przez długi wektor potencjalnych zmiennych objaśniających, regresując zmienną odpowiedzi po kolei. Zamiast wklejać wzór wzoru, myślę o użyciureformulate()
, jak pokazano tutaj.
Funkcjafun()
poniżej wydaje się, że wykonuje pracę, dopasowując pożądany model. Zauważ jednak, że zapisuje w swoim elemencie call theimię skonstruowanego obiektu formuły, a nie jegowartość.
## (1) Function using programmatically constructed formula
fun <- function(XX) {
ff <- reformulate(response="mpg", termlabels=XX)
lm(ff, data=mtcars)
}
fun(XX=c("cyl", "disp"))
#
# Call:
# lm(formula = ff, data = mtcars) <<<--- Note recorded call
#
# Coefficients:
# (Intercept) cyl disp
# 34.66099 -1.58728 -0.02058
## (2) Result of directly specified formula (just for purposes of comparison)
lm(mpg ~ cyl + disp, data=mtcars)
#
# Call:
# lm(formula = mpg ~ cyl + disp, data = mtcars) <<<--- Note recorded call
#
# Coefficients:
# (Intercept) cyl disp
# 34.66099 -1.58728 -0.02058
Moje pytanie: Czy jest w tym jakieś niebezpieczeństwo? Czy może to stać się problemem, jeśli na przykład chcę później zastosowaćupdate
lubpredict
lub jakąś inną funkcję dla obiektu dopasowanego do modelu (ewentualnie z innego środowiska)?
Nieco bardziej niezręczna alternatywa, która ma jednak prawo do zarejestrowanego połączenia, ma być używanaeval(substitute())
. Czy jest to w jakiś sposób ogólnie bezpieczniejsza konstrukcja?
fun2 <- function(XX) {
ff <- reformulate(response="mpg", termlabels=XX)
eval(substitute(lm(FF, data=mtcars), list(FF=ff)))
}
fun2(XX=c("cyl", "disp"))$call
## lm(formula = mpg ~ cyl + disp, data = mtcars)