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ćupdatelubpredict 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)

questionAnswers(1)

yourAnswerToTheQuestion