ho imparato che è pratica comune utilizzare argomenti facoltativi in funzione e controllare con mancanti() (ad esempio come discusso in SO 22024082)Passaggio argomento della funzione mancante di funzionare in R
In questo esempio round0 è l'argomento facoltativo (lo so, round0 potrebbe essere definito come logico).
Ma cosa succede se chiamo questa funzione da un'altra funzione, come posso passare "mancante"?
bar = function(b) {
if(b > 10) round1=T
foo(b, round1)
}
Se b < 10 poi round1 in bar() non è definito, ma è passato a foo comunque. Se modifico foo():
foo = function(a, round0) {
a = a * pi
print(missing(round0))
print(round0)
if(!missing(round0)) round(a)
else a
}
ed eseguire bar (9) l'output è:
bar(9)
[1] FALSE
Error in print(round0) : object 'round1' not found
Called from: print(round0)
Ciò significa: round0 non manca, ma non è possibile accedere sia?
Non voglio utilizzare diverse chiamate di funzione in bar(), se ci sono diversi argomenti opzionali in foo(), dovrei scrivere una chiamata di funzione per ogni mancante/non mancante - combinazione di tutti gli argomenti opzionali .
È possibile passare "mancante" o quale altra soluzione si applica a questo problema?
In genere, se si chiama una funzione in un formato specifico, è necessario assicurarsi di disporre di tutti i parametri. Qui aggiungo un 'round1 = F' all'inizio di' bar' e aggiorno 'foo' con' if (! Missing (round0) && round0) '. Manca la possibilità di chiamare 'foo (a)' o 'foo (a, T/F)', se lo chiami con due parametri, il secondo parametro non manca e deve essere risolvibile. – Tensibai
La mia ipotesi è che "missing" restituisca "FALSE" non appena l'oggetto promessa che rappresenta l'argomento della funzione ha uno slot di espressione non vuoto. Aggiungi la riga 'print (sostituto (round0))' subito dopo 'a = a * pi' nella tua funzione' foo' modificata e quindi esegui 'foo (9)'. 'sostituto' estrarrà lo slot di espressione. Non stamperà nulla, cioè uno slot di espressione vuota per 'round0'. Ora prova 'bar (9)'. Questo stampa 'round1'. Ma quando usi 'print', R proverà a valutare' round1' che non è stato ancora definito (valutazione lazy). – cryo111