3 votes

Pourquoi est-ce que j'obtiens un avertissement " Invalid .internal.selfref detected " (mais aucune sortie) même si je n'utilise pas list(), key<-, names<-, ou attr<- ?

Dans une nouvelle fonction créée par l'utilisateur, j'aime faire quelques transformations de data.table, en particulier j'aime créer une nouvelle colonne avec la commande ':='.

Supposons que je veuille créer une nouvelle colonne appelée Sexe qui met en majuscule la première lettre de la colonne df$sex dans mon exemple de data.frame df.

La sortie de ma fonction prepare doit être un tableau de données avec le même nom que précédemment mais avec la colonne supplémentaire "capitalisée".

J'ai essayé plusieurs façons de boucler sur le tableau data.table. Cependant, j'obtiens toujours l'avertissement suivant (et aucune sortie correcte) :

Message d'avertissement : Dans [.data.table (x, , := (Sex, stringr::str_to_title(sex))) : Invalide .internal.selfref détectée et corrigée en prenant une copie (peu profonde) de la table de données afin que := puisse ajouter cette nouvelle colonne par référence. À un moment antérieur, ce tableau de données a été copié par R (ou a été créé manuellement en utilisant structure() ou similaire). Évitez les names<- et attr<- qui, dans R, peuvent actuellement (et bizarrement) copier l'ensemble du data.table. Utilisez plutôt la syntaxe set* pour éviter la copie : ?set, ?setnames et ?setattr. Si ce message ne vous aide pas, veuillez signaler votre cas d'utilisation dans le suivi des problèmes de data.table afin que la cause première puisse être corrigée ou que ce message soit amélioré.

library(data.table)
library(magrittr)
library(stringr)

df <- data.frame("age" = c(17, 04), 
                      sex = c("m", "f"))
df %>%   setDT()
is.data.table(df)

C'est la façon la plus simple d'écrire ma fonction :

prepare1<-function(x){
x[,Sex:=stringr::str_to_title(sex)]
}
prepare1(df)
#--> WARNING. (as block quoted above)

prepare2<-function(x){
  x[, `:=`(Sex, stringr::str_to_title(sex))]
}
prepare2(df)
#--> WARNING. . (as block quoted above)

prepare3<-function(x){
  require(data.table)
  y <-as.data.table(list(x))
  y <- y[,Sex:=stringr::str_to_title(sex)]
  x <<- y
}
prepare3(df)

La dernière version n'affiche pas l'avertissement, mais crée un nouvel ensemble de données appelé x. Mais je voulais remplacer l'ensemble de données que j'ai mis dans la fonction (si je dois utiliser cette méthode).

De la := fichier d'aide Je sais également que je peux utiliser set, mais je ne suis pas en mesure d'adapter la commande de manière appropriée. Si cela pouvait résoudre mon problème, je serais heureux de recevoir de l'aide à ce sujet également ! set(x, i = NULL, Sex, str_to_title(sex)) a apparemment tort ...

Sur demande / pour rendre la discussion dans les commentaires plus claire, je montre comment mon code produit le problème.

    library(data.table)
library(stringr)

df <- data.frame("age" = c(17, 04), 
                      sex = c("m", "f"))

GetLastAssigned <- function(match = "<- *data.frame",
                            remove = " *<-.*") {
  f <- tempfile()
  savehistory(f)
  history <- readLines(f)
  unlink(f)
  match <- grep(match, history, value = TRUE)
  get(sub(remove, "", match[length(match)]))
}

#ok, no need for magrittr
setDT(GetLastAssigned())

#check the last function worked
is.data.table(df)

prepare1<-function(x){
x[,Sex:=stringr::str_to_title(sex)]
}

prepare1(GetLastAssigned())
# I get a warning and it does not work.
prepare1(df)
# I get a warning and it does not work, either.

#If I manually type setDT(df) everything works fine but I cannot type the "right" dfs at all the places where I need to do this transformation.

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