Utrzymuję pakiet, który polega na wielokrotnych połączeniach z deparse(control = c("keepNA", "keepInteger"))
. control
jest zawsze taki sam, a wyrażenie jest różne. deparse()
wydaje się, że spędza dużo czasu, wielokrotnie interpretując ten sam zestaw opcji .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
W niektórych systemach nadmiarowe .deparseOpts()
połączenia w rzeczywistości zajmują większość czasu działania deparse()
( tutaj wykres płomienia ).
Naprawdę chciałbym po prostu zadzwonić .deparseOpts()
raz, a następnie podać kod numeryczny deparse()
, ale wydaje się to niemożliwe bez bezpośredniego wywołania .Internal()
lub wywołania kodu C, z których żaden nie jest optymalny z punktu widzenia rozwoju pakietu.
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>
Czy istnieje wygodne obejście?
backtick
obliczeniu argumentu odparowywanie jest 6 razy szybsze! Idę z tym. Dziękuję bardzo za obejście!R CMD check
wykrywa.Internal()
wywołanie funkcji wyprodukowanych przez (1). Potrzebuję dość łatwego obejściamake_deparse()(expr, control = 64, backtick = TRUE)
. Głupio jest zrekonstruować deparser za każdym razem, gdy go używam, ale wciąż jest znacznie szybszy niż naiwny,deparse()
którego wcześniej używałem .make_deparse
iRun
w (1) i działałemR CMD build
iR CMD check --as-cran
działałem"R version 3.6.1 Patched (2019-11-18 r77437)"
, ale nie narzekałem i nie potrzebowałem żadnych obejść. Czy jesteś pewien, że nie robisz czegoś innego lub dodatkowo tego powoduje?direct_deparse <- make_direct_deparse()
. Kod pokazany w odpowiedzi uważał, aby tego nie robić i definiował go tylko w funkcji, tjRun
. W.