2015-03-27 18 views
10

Ich habe mehrere Funktionen übergeben Argumente, die möglicherweise fehlen.R Lazy Evaluation Paradox (R-Fehler?)

z.B. Ich habe

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

mit dem interessanten Aspekt, dass die einzige Interaktion von mytest(somearg) mit dem arg ist, dass es prüft, ob das Argument fehlt nicht:

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

subfunction testet dann wieder, wenn es fehlt und Leckereien dementsprechend es:

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

der Kicker ist, dass mit somearg fehlt, das nicht funktioniert: matrix(somearg, cols = 2) fehlt

Argument "somearg" wirft, ohne Standard

während der Fehlersuche, fand ich folgendes:

  1. zu Beginn der mainfunction, missing(somearg) kehrt TRUE
  2. in mytest, missing(somearg) liefert TRUE
  3. in subfunction, missing(somearg) kehrt FALSE (!!!!)

daher die matrix Zweig getroffen wird, aber in Wirklichkeit someargist fehlt, so scheitert es ...

wat.

+1

Ich vermute dass das Problem hier darin besteht, dass Sie die Unterfunktion nicht direkt aufrufen, sondern von einer verschachtelten Funktion, die eine Schließung erzeugt über das Argument 'Somearg'. Es scheint, dass Schließungen fehlende Argumente nicht behandeln können. Ich bin mir nicht sicher, ob das ein Fehler oder "von Design" ist: Innerhalb 'Spaß',' Somearg' ist ** nicht ** ein Argument, es ist eine normale Variable und kann daher nicht fehlen. –

+6

Siehe die Dokumentation: "Derzeit kann' missing' nur im unmittelbaren Hauptteil der Funktion verwendet werden, die das Argument definiert, nicht im Rumpf einer verschachtelten Funktion oder eines 'lokalen' Aufrufs." – Roland

+0

mit "kann nur verwendet werden" bedeutet "es wird sich sonst völlig unerwartet verhalten". Verdammt. Vielen Dank. –

Antwort

1

der @BenBolker Weg:

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 
} 

Eine weitere Möglichkeit, explizites fehlendes Argument

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 
} 

Ein dritte Weg, schlicht fehlen arg Gang mit:

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 
    }