2012-07-19 108 views
38

我搜索了一個參考來學習R中的替換函數,但是我還沒有找到任何東西。我想了解的R.替換功能,我有下面的代碼的概念,但我不明白:什麼是R中的替換函數?

"cutoff<-" <- function(x, value){ 
x[x > value] <- Inf 
x 
} 

,然後我們稱之爲截止用:

cutoff(x) <- 65 

莫非任何人都可以解釋R中的替代函數是什麼?

+5

這是一個完全可以接受的Q值SO – 2012-07-19 14:46:35

+2

['levels <-'(這是什麼巫術?)(http://stackoverflow.com/questions/10449366/levels-what-sorcery-is-this ) – 2012-07-19 17:03:44

+0

請參閱**擴展R.-約翰錢伯斯(2016)**:*第5章第73至79頁* – 2016-11-13 05:24:55

回答

42

當你調用

cutoff(x) <- 65 

你實際上是調用

x <- "cutoff<-"(x = x, value = 65) 

函數的名稱必須用引號引起來,因爲它是語法上有效,但不規範的名稱和解析器會如果操作符未被引用,則不作爲函數名稱的一部分解釋爲<-

"cutoff<-"()就像任何其他功能(雖然有一個奇怪的名字);它會根據value(其中x大於65Inf(無限))設置任何值來更改其輸入參數。

神奇,當你調用函數這樣

cutoff(x) <- 65 

,因爲R的解析時,拉出各個位,使上面顯示的實時調用真正被完成。

更一般地,我們有

FUN(obj) <- value 

[R發現功能"FUN<-"(),並通過將objvalue"FUN<-"()安排的"FUN<-"()結果被分配回obj建立呼叫,因此它調用:

obj <- "FUN<-"(obj, value) 

這是一個有用的參考編隊是R Language Definition Section 3.4.4: Subset assignment;討論是有點傾斜的,但似乎是最正式的參考文獻(替換功能在R FAQ(R和S-PLUS之間的區別)中以及在R語言參考(各種技術問題)中被提及,但在官方文件中我沒有找到任何進一步的討論)。

+0

非常非常有幫助的答案...非常感謝您:) – Sam 2012-07-19 15:02:29

9

Gavin對替換函數的解釋提供了極好的討論。我想提供一個參考,因爲您還要求:R Language Definition Section 3.4.4: Subset assignment

+0

我欣賞它Brian。 – Sam 2012-07-19 17:00:50

+5

有用,但只有鏈接的答案...我正在編輯@ GavinSimpson的答案添加它...... – 2014-11-07 21:19:29

2

請記住,在R中所有的操作都是一個函數調用(因此也是賦值操作),所有存在的東西都是一個對象。 代用功能充當如果他們修改它們的就位參數諸如在

colnames(d) <- c("Input", "Output") 

它們具有標識符<-在它們的名稱的末尾,並返回參數對象的經修改的拷貝(非原始置換函數)或同一對象(原始替代功能)

於R提示,以下將不起作用:

> `second` <- function(x, value) { 
+ x[2] <- value 
+ x 
+ } 
> x <- 1:10 
> x 
[1] 1 2 3 4 5 6 7 8 9 10 
> second(x) <- 9 
Error in second(x) <- 9: couldn't find function "second<-" 

正如你看到的,R是不是搜索環境second,但是對於second<-。 所以,讓我們做同樣的事情,但使用這樣的功能標識代替:

> `second<-` <- function(x, value) { 
+ x[2] <- value 
+ x 
+ } 

現在,在載體的第二位置的分配工作:

> second(x) <- 9 
> x 
[1] 1 9 3 4 5 6 7 8 9 10 

我也寫了一個簡單的腳本來列出R基礎包中的所有替換功能,find it here

+0

在您的博客上發表了關於腳本的評論,以提供所有替換函數:「您是否錯過了那些替換函數,之間的「'<-'」?例如'split < - 。default'和 'split < - 。data.frame'?「 – 2016-05-14 17:04:08

+0

@ManuelS我在檢查: '>裂< - data.frame Fehler:OBJEKT '.data.frame' nicht gefunden >裂< - 默認 Fehler:OBJEKT '.DEFAULT' nicht gefunden >' – TMOTTM 2016-05-17 18:04:25

+0

@ManuelS哈德利沒有寫在Advanced R中有關這些命名函數的任何內容。您是否提供了您提到的函數的參考? – TMOTTM 2016-05-17 18:13:14