Почему используется `<< -` нахмурился и как я могу его избежать?
Я продолжил обсуждение ЗДЕСЬ, и мне любопытно, почему использует <<-
, нахмуренный в 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