2016-10-22 5 views
1

A partir de ces chaînesÉvaluer les chaînes de régression

data = "mtcars" 
y = "mpg" 
x = c("cyl","disp") 

, je suis en train de réaliser un modèle linéaire. J'ai essayé des choses comme

epp=function(x) eval(parse(text=paste0(x,collapse="+"))) 

lm(data=epp(data),epp(y)~epp(x)) 
# Error in eval(expr, envir, enclos) : object 'cyl' not found 

où la dernière ligne était destinée à être équivalente à

lm(data=mtcars,mpg~cyl+disp) 
+0

Vous allez avoir un flot de personnes vous disant de ne pas faire cela du tout, à moins que vous fournissiez un contexte détaillé, que je vais deviner implique une sorte d'application qui sollicite des arguments de données, x et y d'un utilisateur, puis exécute un modèle linéaire? Expliquer ce contexte évitera probablement les malentendus et conduira probablement à de meilleures réponses. – joran

+0

@joran Mon objectif est de créer une fonction qui effectue une sélection de modèle pas à pas pour MCMCglmm. –

+0

Dans ce cas, il semble terriblement étrange que vous passiez une représentation de caractère du nom du bloc de données, plutôt que l'objet lui-même. – joran

Répondre

4

Cela implique deux opérations qui sont tous deux décrits dans plusieurs SO entrées qui utilisent peut-être individuellement soit les get ou as.formula fonctions :

lm(data=get(data), 
    formula=as.formula(paste(y, "~", paste(x, collapse="+"))) 
) 

Dans les deux cas, vous utilisez un objet texte/caractère pour renvoyer un objet langage. Dans le premier argument get renvoie un «symbole» qui peut être évalué et dans la deuxième instance as.formula renvoie un objet «formule». @blmoore a raison de nous informer que lm acceptera un objet caractère, donc l'appel as.formula n'est pas nécessaire ici.

+0

Battez-moi! Vous pouvez même laisser 'lm' faire la coercition à la formule à partir du caractère – blmoore

+0

@ Remi.b: Le Gardien de R Pureté nous conseille d'éviter d'utiliser' eval (parse (... 'parce que c'est habituellement une méthode pour lancer R dans une macro Pour 'blmoore': je n'avais pas réalisé que NSE était descendu dans le traitement' lm' des valeurs de caractères, mais je suppose que cela ne crée pas vraiment d'ambiguïté. –