2016-09-19 110 views
2

對於java程序員要理解的我來說,這條線非常困難。我認爲'< - '是運營商,是一個分配運營商。但是我怎麼能理解內部的子流程。 c(5,4)使向量具有兩個值,然後該值如何傳遞給dim函數的輸入?這個慣例對我來說不熟悉這一點。dim()函數的約定插入參數

dim(m) <- c(5,4) # Dimensions set to 5 & 4, so m is now a 5x4 matrix 

回答

2

這通常被稱爲「語法糖」。

R的對象在理論上是不可變的。做這樣的事情:

dim(m) = c(4,5) 

看起來是改變m,但在現實中的語法樹被寫入如:

m = D(m, c(4,5)) 

其中D是從另一個矩陣構建矩陣和功能一套新的維度。之前的m現在很可能是用於垃圾回收的,現在名稱m指向重新定義的矩陣。

這樣的句法糖在R用於在物體似乎變異最多的地方,如a[1]=2,這是在語法樹表示爲a = B(a,1,2),其中B是創建從原來的a但載體的構造函數第一個值設置爲2。

注:這些分配功能,在上面的例子中DB在R的實際命名dim<-[<-,我呼籲清晰度DB因爲<-函數名稱看起來有點怪異,但R中完全可以接受的標識符

+0

雖然你所說的每一個'* < - '函數都是正確的,'[<-'函數的處理方式是不同的(至少在最近的R版本中),並且可能實際上改變了對象*引用*。嘗試使用'require(data.table); a <-1:10;地址(a); a [7L] < - 11L;地址(a)',並且地址在替換之前和之後通常是相同的。 – nicola

+0

@nicola在[< - 什麼[是什麼意思? – verystrongjoe

+0

我試過這個實例。但我嘗試了很多次。但都一樣 – verystrongjoe

0

你是正確的<-是賦值運算符(在幾乎所有情況下,這是一樣的=運營商)。

當您運行

dim(m) <- c(5, 4) 

你實際上是調用該函數

dim<- 

此功能,甚至有一個幫助頁面?dim<-。所以

dim(m) <- c(5, 4) 

是相當於

m <- `dim<-`(m, c(5, 2)) 

這是很常見的R:

# Vectors 
x[1] = 10 
## Data frames 
df[1, 2] = 50 
+0

因此..您的意思是操作員不僅將值分配給左側的值,還將參數分配給左側的功能? – verystrongjoe

+0

如果我理解你的評論,是的 – csgillespie

1

當你做dim(m) <- *,你實際上調用不同功能設置尺寸爲m。該功能是dim<-。它相當於以下內容:

m <- `dim<-`(m, c(5, 4)) 

所以會發生什麼是一個新矩陣返回您指定的尺寸。 R解析器處理將原始語法轉換爲dim<-的任務。

其他分配操作(例如names(*) <-,class(*) <-等)也會發生同樣的情況。當您分配給子集時也會發生這種情況,如m[a, b] <-:在這種情況下,該功能是[<-