Почему использование `<< -` осуждается и как я могу избежать этого? - PullRequest
9 голосов
/ 24 марта 2012

Я следил за обсуждением на ЗДЕСЬ и мне любопытно, почему использование <<- не одобряется в R. Какое замешательство это вызовет?

Мне также хотелось бы несколько советов о том, как мне избежать <<-. Я использую следующее довольно часто. Например:

### Create dummy data frame of 10 x 10 integer matrix.
### Each cell contains a number that is between 1 to 6.
df <- do.call("rbind", lapply(1:10, function(i) sample(1:6, 10, replace = TRUE)))

Чего я хочу добиться - это сдвинуть каждое число на 1, то есть все 2 станут 1, все 3 придут 2 и т. Д. Следовательно, все n придут n-1. Я достигаю этого следующим:

df.rescaled <- df
sapply(2:6, function(i) df.rescaled[df.rescaled == i] <<- i-1))

В этом случае, как я могу избежать <<-? В идеале я хотел бы иметь возможность передать результаты sapply в другую переменную в соответствии с:

df.rescaled <- sapply(...)

Ответы [ 2 ]

15 голосов
/ 24 марта 2012

Первая точка

<<- является НЕ оператором, назначаемым глобальной переменной.Он пытается присвоить переменную в ближайшем родительском окружении.Так, скажем, это приведет к путанице:

f <- function() {
    a <- 2
    g <- function() {
        a <<- 3
    }
}

затем

> a <- 1
> f()
> a # the global `a` is not affected
[1] 1

Второй пункт

Вы можете сделать это, используя Reduce:

Reduce(function(a, b) {a[a==b] <- a[a==b]-1; a}, 2:6, df)

или apply

apply(df, c(1, 2), function(i) if(i >= 2) {i-1} else {i})

Но

просто, этого достаточно:

ifelse(df >= 2, df-1, df)
4 голосов
/ 24 марта 2012

Вы можете думать о <<- как о глобальном присваивании (приблизительно, потому что, как указывает kohske, оно присваивается верхней среде, если имя переменной не существует в более проксимальной среде).Примеры того, почему это плохо, приведены здесь:

Примеры опасностей глобалов в R и Stata

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...