lambda-comme des fonctions dans R?
Je suis nécessaires à l'utilisation de/en savoir R pour une nouvelle conférence à uni et je suis actuellement un peu en difficulté avec sa syntaxe. Je veux tracer (via curve
) est une fonction simple, mais je n'arrive pas à le faire fonctionner avec une ligne lambda-comme la fonction.
J'ai essayé ce qui suit:
> curve( function(x) x^2 )
Error in curve(function(x) x^2) :
'expr' did not evaluate to an object of length 'n'
Quand j'ai cependant magasin de la fonction dans une variable tout d'abord, il fonctionne:
> quad <- function(x) x^2
> curve( quad )
Est un inline utilisation non autorisée dans R? Est-il un autre moyen de faire ce travail sans la définition d'une fonction supplémentaire? Merci!
- Cela fonctionne:
curve( x^2 )
Vous devez vous connecter pour publier un commentaire.
Vous avez à regarder la source de
curve
à apprécier ce qui se passe (il suffit de tapercurve
à l'invite de commandes et appuyez sur entrée).Là, vous pouvez trouver comment l'expression passée est analysée.
La seule façon d'une fonction est découvert comme étant juste que, c'est quand seul son nom est transmis (voir la
is.name
partie). Si ce n'est pas le cas, l'expression est appelée pour chaquex
. Dans votre cas: pour chaquex
, le résultat est une fonction, ce qui n'est pas une pensée heureuse pour le traçage...Donc en bref: non, vous ne peut pas faire ce que vous avez essayé, mais comme @ROLO indiqué, vous pouvez immédiatement passer le corps de la fonction, qui sera analysée comme une expression (et doit contenir
x
). Si cela est plusieurs états, suffit de les enfermer dans des accolades.Juste pour être complet. Vous pouvez utiliser "la lambda-like" (anonyme) des fonctions dans R, mais si vous souhaitez les mettre à profit immédiat, vous devez encadrer la définition de la fonction entre parenthèses ou accolades:
Dans le cas de
curve
le premier argument est soit une expression ou un nom de fonction - mais si c'est un nom de fonction alors qu'il est d'abord convertie en une expression. (Voir les premières lignes dans le code source decurve
). Donc, si son " pas un nom de fonction, vous aurez besoin d'une expression qui peut contenir un "lambda" la fonction:Si vous souhaitez utiliser une fonction (par opposition à son nom) comme argument, vous pouvez utiliser de la parcelle.fonction:
magrittr
on peut maintenant à quelque chose comme1 %>% {.+1}
au lieu de{function (x) x+1}(1)
x
, a cryptique ce sens que se pose uniquement dans le contexte de l' (caché) du corps de la fonction appelée.x
danscurve(x^2)
n'est pas défini, mais il est évalué de façon non standard. (Peut-être que vous avez voulu dire non, pas paresseux évaluation. Il peut être déroutant, oui. Comme danslibrary(pryr)
, pryr peut être cité ou pas, et c'est le même. Cependant, il doit être indiqué dans lainstall.packages("pryr")
. Vous pouvez voir non standard d'évaluation chaque fois quesubstitute
est utilisé dans une fonction.(function(x) 1)()
. Elle correspond à la valeur1
même si un argument requis n'a pas été fourni. L'argument (x) serait évalué uniquement lors de la première utilisation, mais cela n'arrive jamais dans cet exemple.x
, il doit être parseable (par exemple, "`" [deux backticks] et "ho ho" ne passeront pas).curve
fonctionne parce qu'il utilise non-standard d'évaluation pour analyser lesexpr
argument. Mais qui a encore besoin d'évaluation différée ou d'autrex
permettrait de résoudre les non définies avant d'atteindre le corps de la fonction. J'ai surtout en commentant ce du point de vue de la façon dont les autres langues n'ont pas cette possibilité de reporter (et relire) l'argument de l'expression de l'analyse.