2015-03-27 14 views
10

Mam wiele funkcji przekazywania argumentów, które mogą nie być dostępne.R leniwy paradoks oceny (błąd R?)

np. Mam

mainfunction <- function(somearg) { 
    mytest(somearg) 
    fun <- function() { subfunction(somearg) } 
    fun() 
} 

z interesującym aspektem że jedyna interakcja mytest(somearg) z arg jest to, że sprawdza, czy argument nie brakuje:

mytest = function(somearg) { 
    print(missing(somearg)) 
} 

subfunction następnie ponownie testuje jeśli brakuje i traktuje to odpowiednio:

subfunction = function(somearg) { 
    if (missing(somearg)) 
     somearg = NULL 
    else 
     somearg = matrix(somearg, cols = 2) 
    # somearg is used here… 
} 

kicker jest to, że z somearg brakuje, to nie działa: matrix(somearg, cols = 2) rzuca

argument "somearg" brakuje, bez domyślnie

podczas debugowania, znalazłem następujące:

  1. na początku mainfunction, missing(somearg) powraca TRUE
  2. w mytest, missing(somearg) zwraca TRUE
  3. w subfunction, missing(somearg) powraca FALSE (!!!!)

dlatego matrix oddział jest trafiony, ale w rzeczywistości jestsomeargbrakuje, więc to się nie powiedzie ...

wat.

+1

Zgaduję problem polega na tym, że nie nazywasz bezpośrednio podfunkcji, lecz raczej z funkcji zagnieżdżonej, która tworzy zamknięcie nad argumentem 'somearg'. Wydaje się, że zamknięcia nie mogą traktować brakujących argumentów. Nie jestem pewien, czy jest to błąd, czy "od samego początku": wewnątrz 'fun',' somearg' jest ** nie ** argumentem, jest to normalna zmienna, a więc nie może jej brakować. –

+6

Zobacz dokumentację: "Obecnie' missing' missing "może być użyte tylko w bezpośrednim ciele funkcji, która definiuje argument, a nie w ciele funkcji zagnieżdżonej lub' local' call. " – Roland

+0

z "może być użyty", co oznacza "zachowuje się zupełnie nieoczekiwanie inaczej". cholerny. dzięki. –

Odpowiedz

1

sposób @BenBolker:

mainfunction <- function(somearg = NULL) { 
    mytest(somearg) 
    fun <- function() { subfunction(somearg) } 
    fun() 
} 

mytest = function(somearg) { 
    print(is.null(somearg)) 
} 

subfunction = function(somearg) { 
    if (is.null(somearg)) 
     somearg = 1:10 
    else 
     somearg = matrix(somearg, ncol = 2) 
    somearg 
} 

Innym sposobem, za pomocą wyraźnej brakującego argumentu

mainfunction <- function(somearg) { 
    is_missing <- missing(somearg) 
    mytest(is_missing) 
    fun <- function() { subfunction(somearg, is_missing) } 
    fun() 
} 
mytest = function(x) { print(x) } 
subfunction = function(somearg, is_arg_missing) { 
    if (is_arg_missing) 
     somearg = 1:10 
    else 
     somearg = matrix(somearg, ncol = 2) 
    somearg 
} 

trzeci sposób, przy użyciu zwykłego brakujący arg Podania:

mainfunction <- function(somearg) { 
     is_missing <- missing(somearg) 
     mytest(somearg) 
     fun <- function() { 
      if (is_missing) subfunction() else 
       subfunction(somearg) 
     } 
     fun() 
    } 

    mytest = function(somearg) { 
     print(missing(somearg)) 
    } 

    subfunction = function(somearg) { 
     if (missing(somearg)) 
      somearg = 1:10 
     else 
      somearg = matrix(somearg, ncol = 2) 
     somearg 
    }