2012-03-24 63 views
10

我跟着關於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到每一個數字下移,即所有的2S將成爲1S,所有的三分球將來到2等。因此,所有n會來n-1

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

在這種情況下,我怎麼能避免<<-:我通過以下實現這一目標?理想情況下我會希望能夠管sapply成果轉化的線沿線的另一個變量:

df.rescaled <- sapply(...) 
+0

參見http://stackoverflow.com/questions/14166207/avoiding-global-variables-in-r/14166812 #14166812 – 2013-01-05 03:16:08

回答

16

第一點

<<-運營商分配給全局變量。它試圖在最近的父環境中分配變量。所以說,這將會使困惑:

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) 
+0

感謝您選擇我的代碼。非常感激。你能詳細說明Reduce功能嗎?即使閱讀後,我的邏輯流程我也不太清楚嗎?減少。 我可以理解你正試圖用Reduce和2個變量創建一個函數。對於'a'中的所有'=='到'b'減去'1'。之後有一個'; a'和我丟失的其餘語法 – JackeJR 2012-03-24 13:08:41

+0

'Reduce'也被稱爲'Fold',它是函數式編程中流行的方法。這是一個簡單的解釋。 [wikipedia](http://en.wikipedia.org/wiki/Fold_(higher-order_function)) – kohske 2012-03-24 13:31:00

+0

有關進一步的討論,請參閱:http://stackoverflow.com/a/10904810/2338862 – Thomas 2015-05-27 15:45:53

5

你能想到的<<-全球分配(約,因爲kohske指出其分配頂端環境中,除非變量名稱存在於更近端的環境中)。爲什麼這是壞的例子在這裏:

Examples of the perils of globals in R and Stata

+0

+1鏈接。謝謝! – JackeJR 2012-03-24 13:09:04

+1

由於'x << - value'等價於'assign('x',value,inherits = TRUE)'',所以'' - '作爲檢查封閉環境的賦值是更有意義的。我將它用於與assign('x',value,pos = .GlobalEnv)'完全不同的目的。 – 2013-05-08 01:39:37

相關問題