2009-08-25 12 views
18

To jest bardzo podstawowe pytanie - ale najwyraźniej Google nie jest zbyt dobry w wyszukiwaniu ciągów takich jak "% +%". Moje pytanie brzmi: co i kiedy używa się "% +%" i podobne. Myślę, że to rodzaj scalenia ?.Co robi np.% +%? w R

EDYCJA: OK - wierzę, że odpowiedź na moje pytanie. % X% jest pewnego rodzaju operatorem binarnym. Więc teraz myślę, że będę googlować w poszukiwaniu wiedzy o tym, jak/kiedy z nich korzystać. Moje pytanie zostało częściowo zainspirowane wczorajszym pytaniem - ale dopiero po tym, jak zobaczyłem to na blogu "nauka R" post. Fragment, który spowodował moje pytanie, brzmiał następująco:
W tym celu zostanie utworzona nowa ramka danych z rocznymi sumami, a następnie scalona z istniejącym zestawem danych (nazwy zmiennych w obu ramkach danych powinny być identyczne, aby działał) . Następnie zmieniamy ramkę danych, na której oparty jest wykres.

## 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

W przykładowym kodzie "EDYTUJ" prawie na pewno chcesz "+", a nie "% +%". –

Odpowiedz

24

Ostatecznym powodem jest to, że jeśli wykonujesz zarówno programowanie ogólnego przeznaczenia, jak i obliczenia numeryczne, przydatne jest posiadanie dużego zestawu operatorów binarnych. Na przykład, jeśli przechowujesz liczby w tablicach dwuwymiarowych, możesz pomnożyć tablice elementwise lub możesz obliczyć macierzowy produkt z dwóch tablic. W Matlab tych dwóch operatorów jest .* i *; w R są one * i %*%. Python ma resisted , aby dodać nowe operatory, a więc numpy rozróżnia dwa rodzaje produktów poprzez posiadanie dwóch klas: klasa macierzy jest mnożona elementycznie, klasa macierzy jest mnożona w sensie liniowo-algebry.

Kolejny przykład z Pythona dotyczy innych list, plus oznacza konkatenację: [1,2,3]+[4,5] == [1,2,3,4,5]. Ale w przypadku numpy array plus oznacza elementwise addition: array([1,2]) + array([4,5]) == array([5,7]). Jeśli twój kod wymaga obu, musisz dokonać konwersji między klasami lub użyć notacji funkcji, co może prowadzić do kłopotliwego kodu, szczególnie w przypadku matematyki.

Czasem wygodniej jest mieć więcej operatorów do użycia i nie wiesz z góry, jakich operatorów wymaga konkretna aplikacja. W związku z tym implementatory R wybrały traktować jako operatory o nazwach takich jak %foo% i istnieje kilka przykładów: %in% jest ustawionym członkostwem, %x% jest produktem Kronecker, %o% jest produktem zewnętrznym. Aby zapoznać się z przykładem języka, który podjął to zadanie, zobacz Fortress (sekcja 16 specyfikacji rozpoczyna się od reguł dotyczących nazw operatorów).

W wymienionym wpisie na blogu autor korzysta z zestawu graficznego ggplot2, który definiuje %+% dla oznaczenia pewnego rodzaju kombinacji dwóch elementów fabuły.Naprawdę wydaje się, że dodaje on metodę do gołej + (która jest ogólną funkcją, dzięki czemu można zdefiniować, co to oznacza dla obiektów zdefiniowanych przez użytkownika), ale definiuje również %+%, dzięki czemu można użyć znaczenia ggplot2 z + (cokolwiek to jest) dla innych obiektów. Jeśli zainstalujesz ggplot2, wpisz require(ggplot2) i ?`%+%`, aby wyświetlić dokumentację tego operatora, oraz methods(`+`), aby zobaczyć, że nowa definicja została dodana do +.

+0

wauw - dziękuję bardzo Jouni! Jaka doskonała odpowiedź - teraz wszystko zaczyna mieć sens :-) – Andreas

+0

[Python 3.5 dodaje nowego operatora binarnego] (https://www.python.org/dev/peps/pep-0465/), '@' , które NumPy użyje do mnożenia macierzy. – unutbu

1

oparciu o moje szybkie spojrzenie na manual to może być operator infix zdefiniowane przez użytkownika, więc trudno powiedzieć, co rzeczywiste znaczenie będzie ...

Myślę dodawanie binarne.

+0

Po prostu zwykły + jest dodatkiem binarnym, wierzę -% +% wydaje się nie mieć nic przypisanego do niego. Spróbuj? Arytmetyka, aby uzyskać więcej informacji. –

15

Nie ma ogólnie zdefiniowanego %+%. Może spojrzał na this question from yesterday gdzie

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

i ciąg funkcja konkatenacji ad-hoc została zdefiniowana. Ogólnie rzecz biorąc, składnia "procent-operator-procent" jest otwarta dla zdefiniowanych przez użytkownika funkcji dwóch argumentów, ale istnieje (AFAIK) żadna ogólnie akceptowana wersja dla %+%, której można oczekiwać wszędzie.