2012-04-22 10 views
13

Czy w oprogramowanie może zignorować fakt, że istnieją nieużywane argumenty zdefiniowane podczas uruchamiania modułu? Na przykład mam moduł multiply(a,b), który zwraca produkt a i b. otrzymam błąd, jeśli zadzwonię moduł tak:Nieużywane argumenty w R

multiply(a=20,b=30,c=10) 

Zwracanie błąd na tej właśnie wydaje się nieco zbędny, ponieważ wymagane wejścia a i b zostały określone. Czy można uniknąć tego złego zachowania?

Łatwym rozwiązaniem byłoby po prostu przerwanie określania c, ale to nie daje odpowiedzi, dlaczego zachowanie R zachowuje się w ten sposób. Czy istnieje inny sposób rozwiązania tego problemu?

+1

W odpowiedzi na pytanie "Zwrócenie błędu w tym przypadku wydaje się trochę niepotrzebne", nie sądzę, że jest to niepotrzebne, ponieważ Wyraźnie oczekujesz czegoś na przypisanie dodatkowego argumentu, musisz powiedzieć, że argument nie istnieje, aby zapobiec "nieoczekiwanemu zachowaniu" funkcji. –

+0

Po pierwsze, jest to funkcja, a nie moduł. Po drugie, jak twoja funkcja wie, co zrobić z dodatkowymi argumentami? Myślę, że odpowiedź jest prawidłowa, ale powinna być bardziej ilustracją tego, w jaki sposób można by użyć kropek (inaczej "..."). – geneorama

Odpowiedz

23

Zmiana definicji mnożenia do podjęcia dodatkowych nieznanych argumenty:

multiply <- function(a, b, ...) { 
    # Original code 
} 
7

Jedno podejście (którego nie mogę sobie wyobrazić, jest dobra praktyka programowanie) jest dodanie ... który jest tradycyjnie używany do przekazywania argumentów podanych w jedna funkcja do drugiej.

> multiply <- function(a,b) a*b 
> multiply(a = 2,b = 4,c = 8) 
Error in multiply(a = 2, b = 4, c = 8) : unused argument(s) (c = 8) 
> multiply2 <- function(a,b,...) a*b 
> multiply2(a = 2,b = 4,c = 8) 
[1] 8 

Możesz przeczytać więcej o ... jest przeznaczony do stosowania here

+0

Dlaczego uważasz, że byłaby to zła praktyka? (Nie zgadzam się, po prostu ciekawi.) Czuję, że czytałem dużo dokumentacji R, w której argument "..." jest po prostu ignorowany, co sugeruje, że ludzie robią to od czasu do czasu. – joran

+0

... jest przeznaczony do przekazywania do podfunkcji, w szczególności metod, w których wymagana (lub zaakceptowana) lista argumentów nie jest znana w momencie zapisywania funkcji. Jeśli przejdziesz ... w dół, otrzymasz błąd "nieużywanego argumentu" na głębszym poziomie. Ogólnie rzecz biorąc, niewiedzenie, czy używasz argumentu, czy nie, prowadzi do zamieszania. –

+0

I właśnie uderzyło mnie, że robię to wystarczająco często z wirtualnymi metodami C++. Lista argumentów jest oczywiście poprawiona, ale niektóre metody obiektowe nie potrzebują wszystkich argumentów. –

5

Można używać kropki: ... w definicji funkcji.

myfun <- function(a, b, ...){ 
    cat(a,b) 
} 

myfun(a=4,b=7,hello=3) 

# 4 7 
0

Miałem ten sam problem co ty. Miałem długą listę argumentów, z których większość była nieistotna. Nie chciałem, żeby je zakodowali. To właśnie wymyśliłem

library(magrittr) 
do_func_ignore_things <- function(data, what){ 
    acceptable_args <- data[names(data) %in% (formals(what) %>% names)] 
    do.call(what, acceptable_args %>% as.list) 
} 

do_func_ignore_things(c(n = 3, hello = 12, mean = -10), "rnorm") 
# -9.230675 -10.503509 -10.927077 
Powiązane problemy