9
votes

Passer le cadre de données à la mutation dans la fonction

Je voudrais transmettre une trame de données et ses colonnes à traiter par la mutation de DLIPR dans une fonction.

Voici un exemple P>

    mpg  cyl  disp  hp   drat  wt   qsec  vs am   gear carb newvar
1  21.0   6   160.0 110  3.90 2.620 16.46  0  1    4    4      8
2  21.0   6   160.0 110  3.90 2.875 17.02  0  1    4    4      8
3  22.8   4   108.0  93  3.85 2.320 18.61  1  1    4    1      8


1 commentaires

Voir si les solutions suggérées ici aidez à tout Stackoverflow.com/Questtions/21815060/...


4 Réponses :


5
votes

C'est vraiment moche pour moi, mais semble fonctionner. Fondamentalement, j'ai essayé d'utiliser obtenir code> mais il ne semblait pas savoir où regarder, donc j'ai spécifié l'environnement.

multifun(mtcars, gear)
#                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb newvar
# Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4      8
# Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4      8
# Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1      8
# <<<SNIP>>>
# Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6     10
# Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8     10
# Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2      8


0 commentaires

5
votes

En regardant la solution @anandas, cela semble être un hack le plus simple xxx pré>

à nouveau, prenant une suggestion de Inception @anandas, vous pouvez également faire P>

multifun <- function(dataf, vari){  
  vari <- deparse(substitute(vari))
  dataf <- mutate(dataf, newvar = dataf[, vari]*2)   
  return(dataf) 
}

multifun(mtcars, gear)


3 commentaires

Vous pouvez également ajouter une ligne VARI <- DEPARSE (substitut (VARI)) Si vous souhaitez utiliser une valeur non cochée comme entrée pour le deuxième argument. Je ne sais pas si je considérerais cela un piratage. Pour moi, il est plus lisible que le mien - je voulais juste poster une réponse pour voir si cela m'a aidé à comprendre l'environnement Environnement () Partie de l'erreur.


Cela semble en effet être le plus simple. Il semble toujours que toutes les solutions aboutissent à un code verbose si au lieu d'avoir une variable que nous en avons beaucoup, ou si ces variables apparaissent dans un code complexe. Merci quand même pour toutes les réponses.


Il semble alors que si le code est complexe ou si elle implique de nombreuses variables à partir du cadre de données, la solution la moins verbeuse peut être de spécifier la source des variables dans l'appel de fonction comme indiqué ci-dessus, c'est-à-dire multifun (MTCARS, MTCARS $ Gear ) ou clairement "codage dur" la variable de vitesse dans la définition de la fonction comme dans Ce post



3
votes

ou xxx

à utiliser non coté , il serait préférable d'utiliser la suggestion de @ananda Mahto xxx / p>


2 commentaires

Oui. Cela fonctionne aussi bien. Notez que, à la fois de votre réponse et de mon message, j'ai légèrement édité le code puisque l'ASGING Dataf <- puis le renvoyer était redondant. Merci.


@Robert. Merci d'édition. Je l'ai remarqué mais j'ai oublié de modifier.



2
votes

avec dplyr 0.7.0 , cela peut maintenant être effectué avec Tidyeval: xxx

enquo cite le symbole faisant référence à la fonction L'argument et le regroupe avec l'environnement dans lequel la fonction est appelée en une pince. UQ ou !! peut alors être utilisé pour désquisitionner la pince et l'évaluer immédiatement dans muté .


0 commentaires