Quel est le sens du "." (Point) dans R?

39

Je viens de lire le livre "R in a Nutshell". Et il semble que j'ai sauté la partie où le "." comme dans "sample.formula" a été expliqué.

> sample.formula <- as.formula(y~x1+x2)

Echantillon est-il un objet avec une formule de champ comme dans d’autres langues? Et si oui, comment puis-je savoir quels sont les autres champs / fonctions de cet objet? (Déclaration de type)

EDIT: Je viens de trouver une autre utilisation déroutante du ".":

> svm(formula = is_spam~., data = spambase.training)

(le point entre ~.,)

Fabien
la source
Le point que vous voyez avec l'is_spam ~. commande signifie qu'il n'y a pas de variables explicatives. Typiquement, avec les formules de modèle, vous verrez y ~ x, mais si vous n’avez pas de variable x, y ~. dit de deviner la valeur de y en n'utilisant aucune autre variable. C’est la même chose que le modèley=β0
Christopher Aden
12
@Christopher Au contraire, le .dans la formule dit à R d'utiliser toutes les variables de la trame de données spambase.training(sauf is_spam) comme prédicteurs. Le modèle est adapté . y=β0y ~ 1
Caracal
Je n'ai pas vérifié les sources au préalable. Merci pour la correction!
Christopher Aden
@caracal (+1) Wow, je me demandais comment faire cela. Merci!
Thomas Levine

Réponses:

30

Le point peut être utilisé comme dans un nom normal. Il a cependant une interprétation spéciale supplémentaire. Supposons que nous ayons un objet avec une classe spécifique:

 a <- list(b=1)
 class(a) <- "myclass"

Maintenant, déclarez en myfunctiontant que générique standard de la manière suivante:

 myfunction <- function(x,...) UseMethod("myfunction")

Maintenant déclarer la fonction

 myfunction.myclass <- function(x,...) x$b+1

Alors le point a une signification spéciale. Pour tous les objets avec myclassappel de classe

 myfunction(a)

va réellement appeler la fonction myfunction.myclass:

 > myfunction(a)
  [1] 2

Ceci est largement utilisé dans R, l'exemple le plus approprié est la fonction summary. Chaque classe a sa propre summaryfonction. Ainsi, lorsque vous adaptez un modèle par exemple (qui retourne généralement un objet avec une classe spécifique), vous devez appeler summaryet la fonction de récapitulatif appropriée sera appelée pour ce modèle spécifique.

mpiktas
la source
Je suis très surpris que cette réponse ait été acceptée et beaucoup votée, car elle ne répond pas du tout à la question! Il se réfère aux ellipses ... (qui sont un lexème unique, pas une séquence de trois différents) comme un "point" alors que la question signifie clairement un point . tel qu’il est utilisé dans les formules et les noms d’une manière tout à fait différente, correctement décrit dans un texte contemporain. réponds par Chase.
whuber
3
Eh bien, je ne parle pas des points de suspension. J'ai essayé d'expliquer que le point est utilisé pour l'envoi de la méthode S3. Les fonctions génériques ont généralement des ellipses, c'est pourquoi je les ai utilisées. S'ils sont supprimés du code, la réponse ne changera pas. Je ne peux que deviner que j’ai donné la réponse avant le montage, puisqu’à présent, je donnerais une réponse différente après avoir relu le corps de la question.
Mpiktas
1
Merci pour l'explication. Je pense que l'apparition de "..." deux fois m'a induit en erreur en lui faisant croire que vous l'appeliez un "point".
whuber
12

Regardez la page d'aide pour ?formulaen ce qui concerne .Voici les bits pertinents:

Il existe deux interprétations spéciales de. dans une formule. Le plus courant se trouve dans le contexte d’un argument de données de fonctions d’ajustement de modèle et signifie «toutes les colonnes ne figurant pas dans la formule»: voir terms.formula. Dans le contexte de update.formula, cela signifie seulement «ce qui était auparavant dans cette partie de la formule».

Alternativement, les paquets reshapeet reshape2utilisent .et ...un peu différemment (de ?cast):

Il existe quelques variables spéciales: "..." représente toutes les autres variables non utilisées dans la formule et "." ne représente aucune variable

Chasse
la source
5

Il existe quelques exceptions (envoi de la méthode S3), mais en général, il est simplement utilisé comme aide à la lisibilité et n'a donc pas de signification particulière.

Nick Sabbe
la source
2
Je dirais le contraire - cela a une signification particulière (le message S3 que vous avez mentionné), mais certaines anciennes conventions de dénomination faisaient en sorte que les noms de fonction qui ne sont pas des génériques S3 aient un nom .. Cela concerne les noms de fonctions. En ce qui concerne les noms d'objets (non fonctionnels), alors oui, il n'y a pas de signification particulière.
Réintégrer Monica - G. Simpson
Au début d'un nom, un .rend l'objet invisible ls().
Caracal
2

Le point dans sample.formula ne sépare pas l' échantillon de la formule , sauf visuellement. C'est juste un nom de variable. Les noms de variables R peuvent comprendre des caractères alphanumériques, des points (.) Et des traits de soulignement (_), à une exception près. Voici la règle actuelle:

" Un nom syntaxiquement valide se compose de lettres, de chiffres et du point ou des caractères soulignés et commence par une lettre ou un point non suivi d'un chiffre. Les noms tels que" .2way "ne sont pas valides, pas plus que les mots réservés. "

Le deuxième cas (c'est-à-dire le cas de is_spam ~. ) Est différent et est expliqué ci-dessus.

M. Naci Akkök
la source