2013-01-04 19 views
19

Wiem, że dla listy częściowe dopasowywanie jest wykonywane podczas indeksowania przy użyciu podstawowych operatorów $ i [[. Na przykład:Częściowe dopasowanie argumentu funkcji

ll <- list(yy=1) 
ll$y 
[1] 1 

Ale nadal jestem newbie R i to jest dla mnie nowe, częściowe dopasowanie argumentów funkcji:

h <- function(xx=2)xx 
h(x=2) 
[1] 2 

Chcę zrozumieć jak to działa. Jaki mechanizm za tym stoi? Czy ma to jakieś skutki uboczne? Chcę zrozumieć, w jaki sposób można sprawdzić, czy argument xx został podany?

Edit po Andrie komentarza:

Wewnętrznie R wykorzystuje algorytm pmatch dopasować argumentu, tutaj przykład jak to działa:

pmatch("me", c("mean", "median", "mode")) # error multiple partial matches 
[1] NA 
> pmatch("mo", c("mean", "median", "mode")) # mo match mode match here 
[1] 3 

Ale dlaczego R ma taką funkcję? Jaka jest podstawowa idea dopasowania partial unique?

+3

Przeczytaj http://cran.r-project.org/doc/manuals/R-lang.html#Argument-matching – Andrie

+1

@Andrie Dzięki za link! Przyjmuję to jako odpowiedź, nawet jeśli nie wyjaśnia, dlaczego R ma tę funkcję? Wygląda to na efekt uboczny innych funkcji, ponieważ jest błędem mieć wiele częściowych dopasowań. – agstudy

+3

Oto odgadnięcie "dlaczego". R został zaprojektowany jako język statystyk linii poleceń. Szybki i łatwy sposób analizy danych. Dopasowanie częściowe ułatwia analizę linii poleceń (ale programowanie jest bardziej obarczone). – csgillespie

Odpowiedz

17

Istnieje częściowe dopasowanie, aby zapisać długie nazwy argumentów. Niebezpieczeństwo z tym związane polega na tym, że funkcje mogą później uzyskać dodatkowe argumenty, które powodują konflikt z częściowym dopasowaniem. Oznacza to, że jest on odpowiedni tylko do interaktywnego użytku –, jeśli piszesz kod, który będzie się utrzymywał przez dłuższy czas (na przykład w pakiecie), wtedy zawsze powinieneś pisać pełną nazwę argumentu. Innym problemem jest to, że skracając nazwę argumentu, możesz zmniejszyć czytelność kodu.

dwa wspólne dobre zastosowań to:

  1. len zamiast length.out z funkcją seq (lub seq.int).

  2. all zamiast z all.names z funkcją ls.

Porównaj:

seq.int(0, 1, len = 11) 
seq.int(0, 1, length.out = 11) 

ls(all = TRUE) 
ls(all.names = TRUE) 

W obu tych przypadkach, kod jest prawie tak samo łatwe do odczytania ze skróconych nazw argumentów, a funkcje są stare i na tyle stabilny, że kolejnym argumentem z Nazwa powodująca konflikt jest mało prawdopodobna.

Lepszym rozwiązaniem do zapisywania przy pisaniu jest zamiast automatycznego używania nazw zmiennych i nazw argumentów zamiast skrótów. R GUI i RStudio obsługują to za pomocą klucza TUC, a Architect obsługuje to przy użyciu CTRL + Space .

+1

Używam nawet 'a = T' w' ls'. Czasami możesz uciec, jeśli znasz nazwy arg –

+2

Ogólny komentarz do tej decyzji projektowej. /facepalm w tej funkcji częściowo pasujących nazw argumentów, które mogą powodować błędy w debagowaniu bez powodu. 1. Jeśli cbb do wpisywania długich nazw argumentów, to nie nazywać ich długo w pierwszej kolejności? 2. tab-autouzupełnianie FTW! –

Powiązane problemy