Les fonctions R sont des objets de première classe (de la classe "fonction", bien sûr), ce qui signifie qu'ils peuvent être utilisés pour la plupart comme d'autres objets. Cela se voit dans la syntaxe de la création de fonctions:
Ici, function () est une fonction R intégrée dont le travail est de créer des fonctions! Sur le côté droit, il y a vraiment deux arguments pour function (): La première est la liste des arguments formels pour la fonction que nous créons - ici, seulement x - et la seconde est le corps de cette fonction - ici, juste le retour d'état unique (x + 1). Ce second argument doit être de classe "expression". Donc, le fait est que le membre de droite crée un objet de fonction, qui est ensuite assigné à g.
Par ailleurs, même le "{" est une fonction, comme vous pouvez le vérifier en tapant ceci:
Son travail est de faire une seule unité de ce qui pourrait être plusieurs déclarations.
Ces deux arguments pour function () peuvent ensuite être accédés via les fonctions R formals () et body (), comme suit:
Rappelez-vous que lorsque vous utilisez R en mode interactif, il suffit de taper le nom d'un objet pour imprimer cet objet à l'écran. Les fonctions ne font pas exception, puisqu'elles sont des objets comme n'importe quoi d'autre.
C'est utile si vous utilisez une fonction que vous avez écrite mais dont vous avez oublié les détails. L'impression d'une fonction est également utile si vous n'êtes pas sûr de ce que fait une fonction de bibliothèque R. En regardant le code, vous pouvez le comprendre mieux. Par exemple, si vous n'êtes pas sûr du comportement exact de la fonction graphique abline (), vous pouvez parcourir son code pour mieux comprendre comment l'utiliser.
Si vous souhaitez afficher une longue fonction de cette manière, lancez-la à travers la page ():
Une alternative est de le modifier en utilisant la fonction edit (), dont nous parlerons dans la section 7.11.2.
Notez cependant que certaines des fonctions intégrées les plus fondamentales de R sont écrites directement dans C et ne sont donc pas visibles de cette manière. Voici un exemple:
Les fonctions étant des objets, vous pouvez également les assigner, les utiliser comme arguments pour d'autres fonctions, etc.
Et comme les fonctions sont des objets, vous pouvez parcourir une liste composée de plusieurs fonctions. Cela serait utile, par exemple, si vous souhaitiez écrire une boucle pour tracer un certain nombre de fonctions sur le même graphe, comme suit:
Les fonctions formals () et body () peuvent même être utilisées comme fonctions de remplacement. Nous discuterons des fonctions de remplacement dans la Section 7.10, mais pour l'instant, réfléchissez à la façon dont vous pourriez modifier le corps d'une fonction par affectation:
La raison pour laquelle quote () était nécessaire est que techniquement, le corps d'une fonction a la classe "call", qui est la classe produite par quote (). Sans l'appel à citer (), R essaierait d'évaluer la quantité 2 * x + 3. Donc, si x avait été défini et égal à 3, par exemple, nous assignerions 9 au corps de g (), certainement pas ce que nous voulons. D'ailleurs, puisque * et + sont des fonctions (comme décrit dans la section 2.4.1), en tant qu'objet de langage, 2 * x + 3 est en effet un appel entrant, c'est un appel de fonction imbriqué dans un autre.