2009-08-25 88 views
18

這是一個非常基本的問題 - 但顯然谷歌並不擅長搜索「%+%」等字符串。所以我的問題是 - 什麼時候什麼時候是「%+%」和類似的用法。我猜它是一種合併?eg%+%做什麼? in R

編輯:好的 - 我相信我的問題的答案。 %X%是某種二元運算符。所以現在我想我會谷歌瞭解如何/何時使用這些知識。我的問題部分受到昨天問題的啓發 - 但只是在「學習R」博客上看到這post後。這引起了我的問題的通道是這樣的:
爲了做到這一點,與年度總額新的數據幀將被創建並隨後與現有的數據集合並(在dataframes變量名應該是相同的這個工作) 。然後我們只是改變繪圖所基於的數據幀。

## add total immigration figures to the plot 
total <- cast(df.m, Period ~ ., sum) 
total <- rename(total, c("(all)" = "value")) 
total$Region <- "Total" 
df.m.t <- rbind(total, df.m) 
c1 <- c %+% df.m.t 
+0

在'EDIT'的代碼示例中,您幾乎肯定需要'+'而不是'%+%'。 – 2009-08-25 23:40:29

回答

24

的根本原因是,如果你兩者都做通用的編程和數值計算,它是有用的可用二元運算符的一個大補充。例如,如果將數字存儲在二維數組中,則可能需要將數組乘以元素,否則可能需要計算兩個數組的矩陣乘積。在Matlab中,這兩個運算符分別爲.**;在R中,它們是*%*%。 Python有resistedattempts添加新的運營商,所以numpy通過具有兩個類兩種產品的區分:陣列類的elementwise相乘,該矩陣類在線性代數意義相乘。

在Python另一個例子是,對於列表,加意味着串聯:[1,2,3]+[4,5] == [1,2,3,4,5]。但對於numpy數組,加上意味着元素增加:array([1,2]) + array([4,5]) == array([5,7])。如果您的代碼需要同時執行這兩個操作,則必須在類之間進行轉換或使用函數符號,這可能會導致代碼繁瑣,尤其是涉及數學的代碼。

因此,有時可能會有更多的操作員可以使用,並且您可能事先不知道某個特定應用程序需要哪種操作符。因此,R的實現者已經選擇了像%foo%這樣的任何名稱的操作符,並且存在幾個示例:%in%是設置成員,%x%是Kronecker產品,%o%是外部產品。有關極端情況的語言示例,請參見Fortress(規範的第16部分以操作員名稱的規則開始)。

在您提到的博客文章中,作者正在使用ggplot2圖形包,該圖包將%+%定義爲某種情節元素的組合。真的好像在+中添加了一個方法(這是一個通用函數,因此您可以定義它對用戶定義對象的含義),但它也定義了%+%,以便您可以使用ggplot2的含義+(無論它是)爲其他對象。如果安裝ggp​​lot2,請鍵入require(ggplot2)?`%+%`以查看該運算符的文檔,並輸入methods(`+`)以查看+中已添加新定義。

+0

wauw - 非常感謝你Jouni!多麼好的答案 - 現在開始有意義了:-) – Andreas 2009-09-09 23:37:13

+0

[Python 3.5添加了一個新的二元運算符](https://www.python.org/dev/peps/pep-0465/),'@' ,NumPy將用於矩陣乘法。 – unutbu 2015-01-04 18:31:08

1

根據我快速瀏覽一下manual它可能是一個用戶定義的綴操作,所以,這是很難說的實際意義是什麼?

我想二進制加法。

+0

只是普通+是二進制加法,我相信 - %+%似乎沒有分配給它。嘗試?計算更多信息。 – 2009-08-25 15:24:07

15

沒有通常定義%+%。也許你看過this question from yesterday其中

R> '%+%' <- paste 
R> "foo" %+% "bar" 
[1] "foo bar" 
R> 

和ad-hoc字符串連接函數被定義。通常,'percent-operator-percent'語法對於兩個參數的用戶定義函數是開放的,但是(AFAIK)沒有公認的%+%版本,您可以期待在任何地方出現。