Почему используется `<< -` нахмурился и как я могу его избежать?

Я продолжил обсуждение ЗДЕСЬ, и мне любопытно, почему использует <<-, нахмуренный в 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, т.е. все 2s станут 1s, все 3s придут 2 и т.д. Поэтому все n будут отправлены n-1. Я достигаю этого следующим образом:

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

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

df.rescaled <- sapply(...)

Ответ 1

Первая точка

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

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)

Ответ 2

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

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