2012-10-23 8 views
4

J'ai évalué par programme plusieurs modèles, dont les noms sont dans un vecteur models. Comment puis-je utiliser la fonction mtable avec eux, en les appelant par programme?Comment utiliser les éléments list/vector comme arguments d'objets pour une fonction dans R?

Voici un exemple:

library(memisc) 
a <- rnorm(100,0,1) 
b <- rnorm(100,0,1) 
c <- rnorm(100,0,1) 
d <- rnorm(100,0,1) 
mod1 <- lm(a ~ b) 
mod2 <- lm(c ~ d) 
models <- c("mod1", "mod2") 
mtable(mget(models,envir=globalenv())) 

je puis obtenir une erreur: "no method available for 'getSummary' for an object of class 'list'".

Que puis-je faire? J'ai essayé call et do.call mais sans succès.

Répondre

3

En utilisant do.call:

do.call(mtable, mget(models,envir=globalenv())) 
+0

Merci, cela fonctionne! J'ai essayé différentes combinaisons avec do.call mais apparemment pas très simple ... ** honteux ** –

5

Sans mget():

do.call(mtable, lapply(models, as.symbol)) 
0

Ces réponses ont été utiles pour moi, aussi bien, mais exemple particulier de l'accent Joel obscurci le point général, que je compris par expérimenter. Il est ceci:

Étant donné une fonction qui accepte un nombre variable d'arguments:

fvar <- function(...) {do something} 

Supposons que les arguments que vous voulez passer sont déjà dans une liste:

myargs <- list(a=1:3, b=c(2, 3, 4)) 

Vous pouvez passer les individuellement, par exemple:

fvar(myargs[[1]], myargs[[2]]) 

mais cela ne fonctionne que si votre code connaît le s tructure de la liste.

do.call() vous permet de passer tout ce qui est dans votre liste comme la série d'arguments donnés à la fonction:

do.call(fvar, myargs) 

Ceci est plus général, puisque votre code ne doit pas comprendre ce particulier de la liste la structure est, aussi longtemps que vous pouvez supposer que c'est approprié pour la fonction.

(do.call fait essentiellement la même chose que apply Common Lisp, en passant.)

+0

Je pense que vous voulez 'fvar (myargs [[1]], myargs [[2]])', ou même ' fvar (a = myvar [[1]], b = myvar [[2]]) '. –

+0

(Réalisé que le commentaire que j'essayais d'ajouter n'était pas pertinent, mais ne peut pas le supprimer complètement.) – Mars

+0

Peut-être qu'il y aurait des situations dans lesquelles myargs [1] serait approprié, mais vous avez raison. Je vais éditer la réponse. – Mars

Questions connexes