Wie agstudy bemerkt, ist dies eine Kuriosität im Zusammenhang mit wie args
druckt Dinge. Das heißt, ob args
eine Bytecode-Zeile in seiner Ausgabe enthält, ist kein zuverlässiger Indikator dafür, ob die Funktion Byte-kompiliert wurde oder nicht. vergleichen:
args(writeLines)
## function (text, con = stdout(), sep = "\n", useBytes = FALSE)
## NULL
writeLines
## function (text, con = stdout(), sep = "\n", useBytes = FALSE)
## {
## if (is.character(con)) {
## con <- file(con, "w")
## on.exit(close(con))
## }
## .Internal(writeLines(text, con, sep, useBytes))
## }
## <bytecode: 0x000000001bf3aeb0>
Wir Druck einer Bytecode-Linie für args
vs. Standardfunktionsdruck vergleichen.
arg_shows_bytecode <- function(fn)
{
output <- capture.output(args(fn))
grepl("^<bytecode", output[length(output)])
}
printing_shows_bytecode <- function(fn)
{
output <- capture.output(print(fn))
length(output) > 1 && grepl("^<bytecode", output[length(output) - 1])
}
base_fns <- Filter(is.function, mget(ls(baseenv()), baseenv()))
yn_args <- vapply(base_fns, arg_shows_bytecode, logical(1))
yn_print <- vapply(base_fns, printing_shows_bytecode, logical(1))
Es ist erwähnenswert, dass alle Funktionen, bei denen args
Bytecode Informationen zeigt Primitive sind.
head(base_fns[yn_args])
## $`%*%`
## function (x, y) .Primitive("%*%")
##
## $as.call
## function (x) .Primitive("as.call")
##
## $attr
## function (x, which, exact = FALSE) .Primitive("attr")
##
## $`attr<-`
## function (x, which, value) .Primitive("attr<-")
##
## $attributes
## function (obj) .Primitive("attributes")
##
## $`attributes<-`
## function (obj, value) .Primitive("attributes<-")
Die Umkehrung gilt nicht: einige Basisfunktionen, wo args
nicht Bytecode Informationen sind Primitiven nicht zeigen; andere sind nicht.
yn_prim <- vapply(base_fns, is.primitive, logical(1))
table(yn_args, yn_print, yn_prim)
## , , yn_prim = FALSE
##
## yn_print
## yn_args FALSE TRUE
## FALSE 0 988
## TRUE 0 0
##
## , , yn_prim = TRUE
##
## yn_print
## yn_args FALSE TRUE
## FALSE 119 0
## TRUE 63 0
So nicht-primitive Funktionen im Basispaket sind alle zusammengestellt, aber args
es nicht erwähnen. Primitive Funktionen zeigen beim Drucken keine Bytecode-Meldung und zeigen nur manchmal eine Bytecode-Nachricht, wenn sie mit Argumenten aufgerufen werden.
Ich denke, die Druckdifferenz ist aus historischen Gründen. 'args' wird eher für den Konsolendruck verwendet, vielleicht kann man' formals' verwenden, um eine kohärentere Ausgabe zu erhalten. – agstudy