puzzle pour le r cognoscenti: dites que nous avons un cadre de données: Je sais que nous pouvons faire des choses comme p> obtenir un vecteur de résultats. P> Mais comment puis-je écrire une fonction qui prend une expression (telle que Peu importe que cela sonne bien (je pouvais simplement utiliser i obtenir cette erreur: p> Il manque clairement quelque chose de subtil sur les environnements et l'évaluation. Y a-t-il un moyen de définir une telle fonction? P> p> a code> ou
a> 3 code>) et fait la même chose à l'intérieur. C'est à dire. Je veux écrire une fonction
fn code> qui prend une trame de données et une expression comme arguments et renvoie le résultat de l'évaluation de l'expression "dans" la trame de données en tant qu'environnée. P>
avec code> comme ci-dessus), mais il s'agit simplement d'une version simplifiée d'une fonction plus complexe que j'écris. J'ai essayé plusieurs variantes (en utilisant
eval code>,
avec code>,
Envir code>,
substitut code>,
local code> , etc.) mais aucun d'entre eux ne fonctionne. Par exemple, si je défini
fn code> comme: p>
4 Réponses :
C'est parce que vous ne passez pas d'expression.
Essayez: p> un coup d'œil rapide au code source des fonctions utilisant ceci (par exemple, lm code>) peut révéler beaucoup plus de choses intéressantes à ce sujet. p> p>
Merci, c'est ce qui me manque! Et oui, j'ai essayé de regarder des fonctions telles que sous-ensemble code> et d'autres, pour voir comment ils le font, mais ils étaient internes. N'a pas réfléchi à
lm code>, bon point pour référence future.
Je pense que l'utilisation de substitution dans cette situation est plus canonique. Et je ne suis pas sûr que LM est un bon modèle - assurez-vous au moins de lire les règles d'évaluation non standard standard.
@hadley: vrai. Je pensais juste à propos de match.call () code> et
lm () code> en raison de l'argument code> data code>.
@Prasad CHALASANI sous-ensemble code> n'est pas une fonction interne, écrivez
sousset.data.frame code> dans la console et vous verrez comment cela est fait.
? Dans peut également être d'intérêt.
Le package de réseau fait ce genre de chose d'une manière différente. Voir, E.G., Lattice ::: xyplot.formula code>.
fn <- function(dat, expr) {
eval(substitute(expr), dat)
}
fn(df, a) # 1 2 3 4 5
fn(df, 2 * a + b) # 3 6 9 12 15
+1, très gentil (N'a pas pensé de substitut). L'avantage de match.Call est que vous avez tous vos arguments dans une liste commode, c'est pourquoi j'utilise celui-ci de plus souvent. Mais si vous n'avez pas besoin du reste, il est en effet un moyen très gentil et facile.
Existe-t-il un moyen de transmettre plusieurs expressions dans une liste () ou C () et d'évaluer chacune d'une boucle à boucle pour différents cadres de données qui sont également stockés dans une liste? Je veux la même fonctionnalité que je ne peux tout simplement pas le faire fonctionner pour les données de données et les expressions stockées dans la liste.
@ Blind0ne commence une nouvelle question décrivant votre problème exactement. Vous pouvez relier à cette question.
Une entrée tardive, mais le Si vous en avez besoin dans le formulaire je pense qu'il est plus facile d'utiliser dans Formulaire plus natif p> et ainsi de suite. Dans l'arrière-plan, il utilise datable.table code> approche et syntaxe semblerait être ce que vous êtes après.
C'est exactement comment
[. Data.table code> fonctionne avec le
j code>,
i code> et
par code> arguments.
fn (x, expr) code>, vous pouvez utiliser ce qui suit p>
substitut code> et
eval code> p> p>
Il y a une section sur Wiki Hadley à propos de ce sujet
@Marek c'est une grande référence à lire, merci!
Cette page est-elle toujours accessible?
Y a-t-il quelque chose qui ne va pas avec juste:
fn <- avec code>?
Voici celui du manuel: adv-r.hadley.nz/evaluation.htmlleight/a > (2e édition) et peut-être adv-r.had.co.nz/expressions.html (1ère édition)