2010-10-15 19 views
3

CetteLa création d'un objet dans les noms <-() donne une erreur. Comment expliquer?

x <- list(12, 13) 
names(y <- x) <- c("a", "b") 

donne l'erreur:

Error in names(y <- x) <- c("a", "b") : object 'y' not found 

Quelqu'un peut-il expliquer pourquoi?

Selon les règles d'évaluation de R, y <- x doit être évalué dans la trame parente des noms < -. Donc, y devrait être créé dans un environnement global.

Merci.

[mise à jour] Si l'objet y est déjà présent dans l'environnement mondial, l'erreur est:

Error in names(y <- x) <- c("a", "b") : could not find function "<-<-" 

[MAJ2] Ici, il est, une autre construction, que je rencontrais aujourd'hui.

(X <- matrix(0, nrow = 10, ncol = 10))[1:3] <- 3:5 
Error during wrapup: object 'X' not found 
+0

@Marek Ha, en effet. Alors ça ressemble à un bug pour moi. Cela signifie que les noms d'origine (..) <- ... ne sont pas littéralement convertis en noms <- (..) par l'analyseur. – VitoshKa

+0

Cela surcharge juste 'names', donc il y a une version de fonction, et une version d'objet de données. Je ne reçois pas la même erreur quand j'essaye l'exemple: j'obtiens 'could not find function" <- <- "' – James

+1

Cette erreur ne survient qu'après la création de l'objet y dans l'environnement global. L'erreur que j'ai posté est la toute première. – VitoshKa

Répondre

1

Ceci est probablement dû à une évaluation paresseuse. Il y a peu de garantie quant à l'ordre dans lequel les choses seront faites lorsque vous effectuez plusieurs tâches sur une même ligne. Apparemment, dans ce cas, il essaie de trouver y avant d'évaluer l'affectation. Si vous demandez simplement les noms, alors y est assigné.

Il est préférable de faire ces types de choses en 2 étapes afin de pouvoir être assuré que le premier est fait avant que le second ait besoin des résultats.

+0

Dans les programmes, on le ferait certainement en deux lignes. Mais pour un usage interactif, ce type de trucs R-ish pourrait être très utile. – VitoshKa

+0

Je trouve très difficile d'imaginer une situation interactive où cela serait nécessaire – hadley

+0

@hadley La création d'un nouvel objet comme ci-dessus en est un exemple. Je fais souvent cela dans si et appliquer le type de formulaires. R code de base a également des exemples de telles constructions. – VitoshKa

3

Ceci est lié à la façon dont <- transforme récursivement le LHS, en ajoutant "<-" aux noms des fonctions pour obtenir le formulaire de remplacement. Le premier argument est traité spécialement. Notez la différence entre les deux derniers:

x <- a <- 1 
`f<-` <- function(x, a, value) x 
f(x, a <- 2) <- 2 
f(x <- 2, a) <- 2 
# Error in f(x <- 2, a) <- 2 : could not find function "<-<-" 

Pour ce que vous essayez de faire, j'utiliser setNames de toute façon.

+0

merci. Je n'étais pas au courant de la fonction setNames (dans les statistiques!paquet). Vous voudrez probablement changer le 'f <-' pour retourner' value' au lieu de 'x', sinon la fonction ne fait rien. Ma question est principalement techniquement conceptuelle, je veux juste savoir ce qui se passe avec cette mission; pas nécessairement ce que j'utiliserais cette construction dans ce but. Cela arrive une fois, cependant, quand j'ai découvert le problème :) – VitoshKa

+0

Yeah f n'est pas censé accomplir quelque chose ici, servant plutôt à montrer la différence de traitement pour l'argument initial. L'affectation à a est correcte, mais l'affectation à x est transformée. La transformation récursive est ce qui permet par exemple à x [1] [2] [3] <- 4 de fonctionner (conceptuellement x <- '[<-' (x, 1,' [<-' (x [1], 2, '[<-' (x [1] [2], 3, 4))), bien que R utilise une variable' * tmp * '). – Charles

+0

Les transformations internes en f <- n'expliquent pas l'erreur. Comme Marek l'a souligné dans le commentaire de ma question, les noms <- (...) <- fonctionnent très bien. Votre point sur le traitement spécial de la première variable est valide. Mais ce n'est pas clair dans quel sens c'est spécial et ce qui se passe réellement à l'interne. – VitoshKa