Создание объекта внутри имен <- () выдает ошибку. Как объяснить? - PullRequest
3 голосов
/ 15 октября 2010

Это

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

выдает ошибку:

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

Кто-нибудь может объяснить, почему?

В соответствии с правилами оценки R y <- x должно оцениваться в родительской рамке имен <-.Поэтому y следует создать в глобальной среде. </p>

Спасибо.

[обновление] Если объект y уже присутствует в глобальной среде, то ошибка:

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

[update2] Вот еще одна конструкция, с которой я столкнулся сегодня.

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

Ответы [ 2 ]

3 голосов
/ 15 октября 2010

Это связано с тем, что <- рекурсивно преобразует LHS, добавляя "<-" к именам функций, чтобы получить форму замены.Первый аргумент обрабатывается специально.Обратите внимание на разницу между двумя последними:

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 "<-<-"

Для того, что вы пытаетесь сделать, я бы в любом случае использовал setNames.

1 голос
/ 15 октября 2010

Это, вероятно, из-за ленивой оценки.Существует небольшая гарантия того, в каком порядке будут выполняться операции при выполнении нескольких задач в одной строке.По-видимому, в этом случае он пытается найти y, прежде чем оценивать назначение.Если вы просто спрашиваете имена, тогда присваивается буква y.

Лучше всего выполнять эти действия в два этапа, чтобы вы могли быть уверены, что первое сделано до того, как второму понадобятся результаты.

...