Saya mengelola paket yang bergantung pada panggilan berulang deparse(control = c("keepNA", "keepInteger"))
. control
selalu sama, dan ekspresinya bervariasi. deparse()
tampaknya menghabiskan banyak waktu berulang kali menafsirkan set pilihan yang sama dengan .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
Pada beberapa sistem, .deparseOpts()
panggilan berlebihan sebenarnya mengambil sebagian besar runtime deparse()
( grafik nyala di sini ).
Saya benar-benar ingin hanya memanggil .deparseOpts()
sekali dan kemudian menyediakan kode numerik deparse()
, tetapi itu tampak mustahil tanpa memanggil .Internal()
atau memanggil kode C secara langsung, yang keduanya tidak optimal dari perspektif pengembangan paket.
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>
Apakah ada solusi yang nyaman?
backtick
argumen, deparsing adalah 6x lebih cepat! Saya akan melakukannya. Terima kasih banyak atas solusinya!R CMD check
mendeteksi.Internal()
panggilan dalam fungsi yang dihasilkan oleh (1). Cukup mudah untuk dikerjakan, saya hanya perlumake_deparse()(expr, control = 64, backtick = TRUE)
. Adalah konyol untuk merekonstruksi deparser setiap kali saya menggunakannya, tetapi masih jauh lebih cepat daripada yang naif yangdeparse()
saya gunakan sebelumnya.make_deparse
danRun
di (1) dan berlariR CMD build
dan diR CMD check --as-cran
bawah"R version 3.6.1 Patched (2019-11-18 r77437)"
dan itu tidak mengeluh dan saya tidak memerlukan solusi. Apakah Anda yakin tidak melakukan sesuatu yang berbeda atau yang menyebabkan hal ini?direct_deparse <- make_direct_deparse()
. Kode yang ditunjukkan dalam jawaban berhati-hati untuk tidak melakukan itu dan hanya mendefinisikannya dalam suatu fungsi, yaitu di dalamRun
.