51 votes

Pourquoi a données.tableau défini := plutôt que de surcharger <-?

les données.table a introduit l'opérateur:=. Pourquoi ne pas surcharger <-?

32voto

Matt Dowle Points 20936

Il y a deux endroits <- pourrait être 'surcharge' :

x[i, j] <- value           # 1
x[i, {colname <- value}]   # 2

La première copie sur l'ensemble de l' x de *tmp*, les modifications de la copie de travail, et attribue retour à l' x. C'est une chose R (src/main/eval.c et subassign.c) a discuté récemment sur r-devel ici. Il sonne comme il pourrait être possible de changer de R pour permettre aux emballages, ou R lui-même, pour éviter que la copie d' *tmp*, mais n'est pas actuellement possible, IIUC.

La seconde est que Owen réponse fait référence, je pense. Si vous acceptez qu'il est ok pour faire l'assignation par référence dans j comme cela, alors quel opérateur? Comme par le commentaire d'Owen réponse, <- et <<- sont déjà utilisés par les utilisateurs en j, nous avons donc trouvé :=.

Même si [<- n'ont pas de copie de l'ensemble de l' x, nous avons tout de même := en j donc on peut faire des choses comme ceci :

DT[,{newcol1:=sum(a)
     newcol2:=a/newcol1}, by=group]

Où les nouvelles colonnes sont ajoutées par référence à la table, et le membre de droite de chaque := est évaluée au sein de chaque groupe. (Lorsque := à l'intérieur du groupe est mise en œuvre.)


Mise À Jour Octobre 2012

Comme d'1.8.2 (sur CRAN en Juillet 2012), en := par le groupe a été mis en œuvre pour l'ajout ou la mise à jour des colonnes uniques; c'est à dire, un seul membre de GAUCHE de l' :=. Et maintenant, en v1.8.3 (R-Forge au moment de la rédaction), plusieurs colonnes peuvent être ajoutées par le groupe; par exemple,

DT[,c("newcol1","newcol2"):=list(sum(a),sum(b)),by=group]

ou, peut-être plus élégamment :

DT[,`:=`(newcol1:=sum(a),
         newcol2:=sum(b)), by=group]

Mais le itératif plusieurs RHS, prévue pour un certain temps, d'où la 2ème expression pourrait utiliser le résultat de la première, n'est pas encore mis en œuvre (FR#1492). Donc, cela va donner une erreur "newcol1 not found" et cela doit être fait en deux étapes :

DT[,`:=`(newcol1:=sum(a),
         newcol2:=a/newcol1), by=group]

20voto

Owen Points 14439

Je ne pense pas qu'il existe des raisons techniques, ce devrait être nécessaire, pour la raison suivante: := est utilisé uniquement à l'intérieur d' [...] de sorte qu'il est toujours cité. [...] passe par l'expression de l'arbre pour voir s' := est en elle.

Cela signifie qu'il n'est pas vraiment agir comme un opérateur et ce n'est pas vraiment surchargé; donc, ils auraient pu choisir pratiquement n'importe quel opérateur ils voulaient. Je suppose que peut-être il avait l'air mieux? Ou moins à confusion parce que c'est clairement pas <-?

(Notez que si := ont été utilisés à l'extérieur de l' [...] il ne pouvait pas être <-, parce que vous ne pouvez pas surcharger <-. <- N'est pas évalué à sa gauche l'argument de sorte qu'il ne sait pas ce type).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X