Ich habe gelernt, dass es gängige Praxis ist optionale Argumente in der Funktion zu verwenden und überprüfen Sie sie mit fehlenden() (zB wie in SO 22024082 diskutiert)Passing Argument Funktion fehlt in R funktionieren
In diesem Beispiel round0 ist das optionale Argument (Ich weiß, dass round0 als logisch definiert werden könnte).
foo = function(a, round0) {
a = a * pi
if(!missing(round0)) round(a)
else a
}
Aber was, wenn ich diese Funktion von einer anderen Funktion aus rufe, wie kann ich "missing" übergeben?
bar = function(b) {
if(b > 10) round1=T
foo(b, round1)
}
Wenn b < 10 dann Round1 in bar() nicht definiert ist, wird aber trotzdem weitergegeben foo. Wenn ich ändern foo():
foo = function(a, round0) {
a = a * pi
print(missing(round0))
print(round0)
if(!missing(round0)) round(a)
else a
}
und Laufschiene (9) ist der Ausgang:
bar(9)
[1] FALSE
Error in print(round0) : object 'round1' not found
Called from: print(round0)
Das heißt: round0 nicht fehlt, kann aber auch nicht zugegriffen werden?
Ich möchte nicht verschiedene Funktionsaufrufe in bar() verwenden, wenn es mehrere optionale Argumente in foo() gibt, müsste ich einen Funktionsaufruf für jede fehlende/fehlende - Kombination aller optionalen Argumente schreiben .
Ist es möglich, "missing" zu übergeben, oder welche andere Lösung würde für dieses Problem gelten?
Normalerweise, wenn Sie eine Funktion in einer bestimmten Form aufrufen, sollten Sie sicherstellen, dass Sie alle Parameter haben. Hier würde ich ein 'round1 = F' am Anfang von' bar' hinzufügen und 'foo' mit' if (! Missing (round0) && round0) 'aktualisieren. Missing erlaubt es Ihnen, 'foo (a)' oder 'foo (a, T/F)' aufzurufen, wenn Sie es mit zwei Parametern aufrufen, der zweite Parameter fehlt nicht und muss auflösbar sein. – Tensibai
Meine Vermutung ist, dass "fehlende" 'FALSE' zurückgibt, sobald das Versprechen-Objekt, das das Funktionsargument darstellt, einen nicht leeren Ausdruck-Slot hat. Fügen Sie die Zeile 'print (substitute (round0))' direkt nach 'a = a * pi' in Ihrer modifizierten 'foo'-Funktion hinzu und führen Sie dann' foo (9) 'aus. 'substitute' extrahiert den Ausdrucksslot. Es wird nichts gedruckt, d. H. Ein leerer Ausdruck-Slot für 'Runde0'. Versuche jetzt 'bar (9) '. Dies druckt 'Runde1'. Aber wenn Sie 'print' verwenden, wird R versuchen,' round1' auszuwerten, was noch nicht definiert wurde (faule Auswertung). – cryo111