Ho più funzioni che trattano argomenti che potrebbero mancare.R paradosso di valutazione lazy (R bug?)
ad es. Ho
mainfunction <- function(somearg) {
mytest(somearg)
fun <- function() { subfunction(somearg) }
fun()
}
con l'aspetto interessante che l'unica interazione mytest(somearg)
con l'arg è che esso verifica se l'argomento non manca:
mytest = function(somearg) {
print(missing(somearg))
}
subfunction
quindi verifica nuovamente se non è presente e tratta di conseguenza:
subfunction = function(somearg) {
if (missing(somearg))
somearg = NULL
else
somearg = matrix(somearg, cols = 2)
# somearg is used here…
}
il kicker è che, con somearg
mancante, questo non funziona: matrix(somearg, cols = 2)
tiri
argomento "somearg" manca, alcun valore predefinito
durante il debug, ho trovato il seguente:
- all'inizio del
mainfunction
,missing(somearg)
rendimentiTRUE
- in
mytest
,missing(somearg)
restituisceTRUE
- in
subfunction
,missing(somearg)
rendimentiFALSE
(!!!!)
quindi il ramo matrix
è colpito, ma in realtà, somearg
è mancante, quindi non riesce ...
wat.
Sto indovinando che il problema qui è che non si chiama direttamente "sottofunzione", ma piuttosto da una funzione annidata, che crea una chiusura sopra l'argomento 'somearg'. Sembra che le chiusure non possano trattare argomenti mancanti. Non sono sicuro che si tratti di un bug o di un "design": all'interno di "fun", "somearg" è ** non ** un argomento, è una variabile normale e quindi non può mancare. –
Vedere la documentazione: "Attualmente' mancante 'può essere utilizzato solo nel corpo immediato della funzione che definisce l'argomento, non nel corpo di una funzione nidificata o di una chiamata 'local'." – Roland
con "può essere utilizzato solo" che significa "si comporterà completamente inaspettato". Dannazione. Grazie. –