Warum "fehlt" und default-Argumente werden in der Funktion `lapply`?

Ich bin erstaunt, dass missing scheint nicht zu arbeiten, in einer Funktion, die aufgerufen wird, indem lapply. Angenommen ich haben die folgenden Funktionen:

.add <- function(x, arg, ...) {
  if (missing(arg)) {
    arg <- 1
  }
  print(match.call())
  return(x + arg)
}

wrapper <- function(l, arg, ...) {
  return(lapply(l, .add, arg=arg, ...))
}

Einstellung arg explizite arbeiten wie vorbehalten:

wrapper(list(x=1:10, y=1:10), arg=1)
#FUN(x = X[[1L]], arg = ..1)
#FUN(x = X[[2L]], arg = ..1)
#$x
# [1]  2  3  4  5  6  7  8  9 10 11
#
#$y
# [1]  2  3  4  5  6  7  8  9 10 11

Ohne arg ich würde erwarten, dass die gleiche Ausgabe, aber es funktioniert nicht:

wrapper(list(x=1:10, y=1:10))
#FUN(x = X[[1L]], arg = ..1)
# Error in FUN(X[[1L]], ...) : argument "arg" is missing, with no default

missing arbeitet in geschachtelte wrapper-Funktionen, bei denen keine lapply verwendet wird.
Warum es scheint, haben keine Wirkung in der Funktion von lapply?

BEARBEITEN: Default-Argumente auch nicht arbeiten:

.add <- function(x, arg=5, ...) {
  if (missing(arg)) {
    arg <- 1
  }
  print(match.call())
  return(x + arg)
}

wrapper(list(x=1:10, y=1:10))
#FUN(x = X[[1L]], arg = ..1)
# Error in FUN(X[[1L]], ...) : argument "arg" is missing, with no default

Scheint es, dass arg ist weder fehlt noch zugänglich. Was ist hier passiert?

(Ich weiß, dass ich könnte dies umgehen, indem Sie die Einstellung arg=NULL im wrapper und if (is.null(arg)) im .add oder etwas anderes. .add ist eine interne Funktion, die bestimmt arg durch seine eigene, basierend auf der Eingabe (z.B. arg=mean(x)), und ich will arg im wrapper zu dokumentieren, das argument arg für den Benutzer und ermöglichen dem Benutzer das überschreiben der default-Verhalten. Und am wichtigsten: ich will verstehen warum das wird nicht funktionieren!)

EDIT2: Endlich ist dieses Verhalten behoben. Es war ein bug in R < 3.2.0 finden Sie PR#15707.

  • Ich denke, das problem ist in wrapper nicht lapply. Entfernen Sie das formale argument arg aus wrapper ganz (oder gibt es ein Standard) und es funktioniert für mich.
  • Aus der Dokumentation ?missing: Derzeit missing kann nur verwendet werden, in der unmittelbaren Körper-von der Funktion, die definiert, das argument, nicht in den Körper einer verschachtelten Funktion oder ein lokaler Aufruf. Dies kann sich in Zukunft ändern. Funktioniert diese Hilfe?
  • Das ist richtig, aber .add ist eine interne Funktion und die Funktion dokumentiert ist wrapper (und die möglichen Standard-argument von arg würde davon abhängen, die Teilmenge, die .add).
  • Du hast Recht, aber so funktioniert es: wrapper2 <- function(x, arg) { return(.add(x, arg=arg)) }
  • Ich bin sehr neugierig zu wissen, warum das passiert... ich habe versucht, für eine ganze Weile zu verstehen, aber noch nicht da. Ich werde zurück schreiben, wenn ich etwas finden. Oder vielleicht ist es Zeit, meine erste bounty! 🙂
  • Siehe meine Antwort für das, was ich herausgefunden habe.

InformationsquelleAutor sgibb | 2013-08-08
Schreibe einen Kommentar