Ich pflege ein Paket, das auf wiederholten Anrufen beruht deparse(control = c("keepNA", "keepInteger"))
. control
ist immer gleich und der Ausdruck variiert. deparse()
scheint viel Zeit damit zu verbringen, die gleichen Optionen wiederholt mit zu interpretieren .deparseOpts()
.
microbenchmark::microbenchmark(
a = deparse(identity, control = c("keepNA", "keepInteger")),
b = .deparseOpts(c("keepNA", "keepInteger"))
)
# Unit: microseconds
# expr min lq mean median uq max neval
# a 7.2 7.4 8.020 7.5 7.6 55.1 100
# b 3.0 3.2 3.387 3.4 3.5 6.0 100
Auf einigen Systemen nehmen redundante .deparseOpts()
Aufrufe tatsächlich den größten Teil der Laufzeit von deparse()
( Flammengraph hier ) ein.
Ich würde wirklich gerne nur .deparseOpts()
einmal aufrufen und dann den numerischen Code angeben deparse()
, aber das scheint unmöglich, ohne .Internal()
den C-Code direkt aufzurufen oder aufzurufen, was aus Sicht der Paketentwicklung nicht optimal ist.
deparse
# function (expr, width.cutoff = 60L, backtick = mode(expr) %in%
# c("call", "expression", "(", "function"),
# control = c("keepNA", "keepInteger", "niceNames",
# "showAttributes"), nlines = -1L)
# .Internal(deparse(expr, width.cutoff, backtick, .deparseOpts(control),
# nlines))
# <bytecode: 0x0000000006ac27b8>
# <environment: namespace:base>
Gibt es eine bequeme Problemumgehung?
backtick
Argument vorberechnete, ist das Entparsen 6x schneller! Ich gehe damit. Vielen Dank für die Problemumgehung!R CMD check
erkennt anscheinend den.Internal()
Aufruf von Funktionen, die von (1) erzeugt werden. Ziemlich einfach zu umgehen, ich brauche nurmake_deparse()(expr, control = 64, backtick = TRUE)
. Es ist albern, den Deparser jedes Mal zu rekonstruieren, wenn ich ihn benutze, aber er ist immer noch viel schneller als die Naivität, diedeparse()
ich zuvor benutzt habe.make_deparse
undRun
Funktionen in (1) zu erstellen und liefR CMD build
undR CMD check --as-cran
unter"R version 3.6.1 Patched (2019-11-18 r77437)"
und es hat sich nicht beschwert und ich brauchte keine Problemumgehungen. Sind Sie sicher, dass Sie nichts anderes tun oder zusätzlich, was dies verursacht?direct_deparse <- make_direct_deparse()
. Der in der Antwort gezeigte Code achtete darauf, dies nicht zu tun, und definierte ihn nur innerhalb einer Funktion, dh innerhalbRun
.