2014-10-31 9 views
11

Chciałbym sprawdzić, czy parametr "..." (ellipsis) funkcji R został wprowadzony z niektórymi wartościami/argumentami.Jak sprawdzić, czy jakiekolwiek argumenty zostały przekazane za pomocą "..." (ellipsis) w R? Czy brakuje (...) ważnego?

Obecnie używam coś takiego:

test1 <- function(...) { 
    if (missing(...)) TRUE 
    else FALSE 
} 

test1() 
## [1] TRUE 
test1(something) 
## [2] FALSE 

to działa, ale ?missing nie wskazuje, czy ten sposób jest właściwe/ważny.

Jeśli powyższe informacje nie są poprawne, jaki jest w tym sposób? A może są inne, szybsze sposoby? PS. Potrzebuję tego rodzaju weryfikacji dla numeru this.

+0

http://stackoverflow.com/questions/9877271/how-to-check-existence-of-an-input-argument-for-r-functions – GSee

Odpowiedz

7

Oto alternatywa, która spowoduje błąd, jeśli spróbujesz przekazać nieistniejący obiekt.

test2 <- function(...) if(length(list(...))) FALSE else TRUE 

test2() 
#[1] TRUE 
test2(something) 
#Error in test2(something) : object 'something' not found 
test2(1) 
#[1] FALSE 
+0

+1 to jest prawdopodobnie najbezpieczniejsze –

+0

Oczywiście, ale naprawdę zastanawiam się także, czy 'brakujące (...) 'jest ważny. :) BTW, wyłącznie w celu sprawdzenia, czy jest coś pod '...', 'length (list (...)) == 0' jest trochę [wolniej] (https://github.com/ Rexamine/stringi/issues/111). W każdym razie, dzięki! – gagolews

+0

@gagolews powinno być wolniejsze, ponieważ wymusza ocenę. Trudno powiedzieć, co jest lepsze, nie wiedząc, dlaczego sprawdzasz lub co robisz z tymi informacjami. Może lepiej tu rzucić, może lepiej rzucić później. Przypuszczalnie, jeśli dowiesz się, że są argumenty, zrobisz z nimi coś, co "wymusi" ocenę i błąd. 'length (list (...))' jest również jeszcze jednym wywołaniem funkcji niż 'missing (...)' – GSee

3

myślę match.call jest to, czego potrzebujesz:

test <- function(...) {match.call(expand.dots = FALSE)} 

> test() 
test() 

> test(x=3,y=2,z=5) 
test(... = list(x = 3, y = 2, z = 5)) 

To daje za każdym razem wartości przekazywane w elipsy, czy to będzie puste, jeśli nie przejdzie każdy.

Nadzieję, że pomaga!

+0

Gdyby było więcej parametrów na liście Arg (poza "..."), powinienem przetestować dla 'any (names (match.call (expand.dots = FALSE) [- 1]) ==" ... ")', czyż nie? :) – gagolews

+1

Jeśli koniecznie chcesz, aby dał ci PRAWDA lub FAŁSZ, to tak, powyższe działa świetnie. Jeśli nie, powyższa funkcja działa z większą liczbą parametrów niż "...". Jak już wiesz 'test <- funkcja (k = 7, ...) {match.call (expand.dots = FALSE)}' dla 'testu (x = 3, y = 2, z = 5, k = 5) 'return 'test (k = 5, ... = lista (x = 3, y = 2, z = 5))' – LyzandeR

Powiązane problemy