Mantengo un pacchetto che si basa su chiamate ripetute a deparse(control = c("keepNA", "keepInteger")). controlè sempre lo stesso e l'espressione varia. deparse()sembra passare molto tempo a interpretare ripetutamente lo stesso insieme di opzioni con .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
Su alcuni sistemi, le .deparseOpts()chiamate ridondanti occupano effettivamente la maggior parte del tempo di esecuzione deparse()( grafico della fiamma qui ).
Vorrei davvero chiamare solo .deparseOpts()una volta e quindi fornire il codice numerico deparse(), ma ciò sembra impossibile senza chiamare .Internal()o invocare direttamente il codice C, nessuno dei quali è ottimale dal punto di vista dello sviluppo del pacchetto.
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>
C'è una soluzione alternativa conveniente?