R: en indiquant le nom de la variable en paramètre de la fonction pour une fonction de général (universel) utilisation
Voici ma petite fonction et les données. Veuillez noter que je veux concevoir une fonction non usage personnel pour un usage général.
dataf <- data.frame (A= 1:10, B= 21:30, C= 51:60, D = 71:80)
myfun <- function (dataframe, varA, varB) {
daf2 <- data.frame (A = dataframe$A*dataframe$B,
B= dataframe$C*dataframe$D)
anv1 <- lm(varA ~ varB, daf2)
print(anova(anv1))
}
myfun (dataframe = dataf, varA = A, varB = B)
Error in eval(expr, envir, enclos) : object 'A' not found
Il travaille quand je veux spécifier les données de la variable$nom, mais je ne veux pas faire un tel cahier des charges afin qu'il demande à l'utilisateur d'écrire à la fois les données et le nom de la variable dans la fonction.
myfun (dataframe = dataf, varA = dataf$A, varB = dataf$B)
Analysis of Variance Table
Response: varA
Df Sum Sq Mean Sq F value Pr(>F)
varB 1 82.5 82.5 1.3568e+33 < 2.2e-16 ***
Residuals 8 0.0 0.0
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Warning message:
In anova.lm(anv1) :
ANOVA F-tests on an essentially perfect fit are unreliable
quelles sont les meilleures pratiques dans cette situation? puis-je mettre fixez le dataframe l'intérieur de la fonction? quels pourraient être les inconvénients ou les conflits potentiels /dangers pour le faire? Voir la masqués déclaration de sortie. Je crois que une fois qu'il est attaché restera annexée rappel de la session de droit? La fonction fournie ici est tout simplement l'exemple, j'ai besoin de plus d'analyse en aval, où les noms de variables de différents dataframe peuvent /doivent être identiques. Je suis dans l'attente d'un programmeur solution sur ce point.
myfun <- function (dataframe, varA, varB) {
attach(dataframe)
daf2 <- data.frame (A = A*B, B= C*D)
anv1 <- lm(varA ~ varB, daf2)
return(anova(anv1))
}
myfun (dataframe = dataf, varA = A, varB = B)
The following object(s) are masked from 'dataframe (position 3)':
A, B, C, D
Analysis of Variance Table
Response: varA
Df Sum Sq Mean Sq F value Pr(>F)
varB 1 82.5 82.5 1.3568e+33 < 2.2e-16 ***
Residuals 8 0.0 0.0
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Warning message:
In anova.lm(anv1) :
ANOVA F-tests on an essentially perfect fit are unreliable
OriginalL'auteur jon | 2011-11-14
Vous devez vous connecter pour publier un commentaire.
Examinons de plus près (voir les commentaires que j'ai ajouté) vous fonction d'origine et d'appel, en supposant que vous dire de passer le noms de vous les colonnes de l'intérêt de la fonction:
Remarque: dans ce qui précède, j'ai laissé le code d'origine en place, de sorte que vous pouvez supprimer pour éviter les erreurs qui ont été à l'origine arriver. L'essence de vos problèmes, c'est que vous devez toujours passer les noms de colonnes comme les personnages, et de les utiliser comme telles. C'est l'un des endroits où le sucre syntaxique des formules dans la R permet aux gens dans de mauvaises habitudes et de malentendus...
Aujourd'hui, comme une alternative: le seul endroit où les noms de variable sont effectivement utilisées, sont dans la formule. En tant que tel, vous pouvez simplifier les choses plus loin si vous n'avez pas l'esprit, de légères différences cosmétiques dans les résultats que vous pouvez nettoyer plus tard: il n'est pas nécessaire pour vous de passer le long de la colonne des noms!!
Comme un dernier conseil: je voudrais éviter de l'appel d'impression sur votre dernier relevé: si vous n'avez pas, mais l'utilisation de cette méthode directement à partir de la R de la ligne de commande, il remplira les imprimer pour vous de toute façon. Comme un avantage supplémentaire, vous pouvez effectuer d'autres travaux avec l'objet retourné à partir de votre méthode.
Nettoyé la Fonction d'essai:
OriginalL'auteur Nick Sabbe
Vous pouvez toujours aller le (horreurs)
parse()
route:Qui est-à-dire, à l'intérieur de votre fonction, de récupérer les arguments de la fonction et de construire la trame de données ou les paires de vecteurs de données que vous voulez en utilisant la fonction eval(parse(...)) de l'installation.
OriginalL'auteur Carl Witthoft
Je ne suis pas sûr de bien comprendre vos problème, voici donc ce que j'ai compris : vous voulez que votre fonction à appeler le
lm()
fonction des données extraites à partir de données.cadre donné en argument, et les colonnes de données.image spécifiée par d'autres arguments ?Pour moi la plus simple solution consiste à imiter le
lm()
comportement et de demander à l'utilisateur une formule :Une autre solution est de construire la formule vous-même :
Je ne suis pas familier avec
attach
mais j'essaie de l'éviter lorsque c'est possible, pour masquer les problèmes que vous avez mentionnés. Si vousdetach
à la fin de la fonction, je pense qu'il ne serait pas provoquer l'effet frontière, mais vous pouvez adresser un avertissement.OriginalL'auteur maressyl