les données.table a introduit l'opérateur:=. Pourquoi ne pas surcharger <-?
Réponses
Trop de publicités?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]
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).