我跟着HERE进行了讨论,很好奇为什么在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(...)
答案 0 :(得分:15)
第一点
<<-
NOT 是要分配给全局变量的运算符。它尝试在最近的父环境中分配变量。所以,比方说,这会让人感到困惑:
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)
答案 1 :(得分:4)
您可以将<<-
视为全局赋值(大约,因为正如kohske所指出的那样,除非变量名存在于更近端的环境中,否则它会分配给顶层环境)。这里不好的原因如下: