我维护一个依赖于重复调用的程序包deparse(control = c("keepNA", "keepInteger"))
。control
始终相同,并且表达式也有所不同。deparse()
似乎花了很多时间重复解释与相同的选项.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
在某些系统上,冗余.deparseOpts()
调用实际上占用了deparse()
(火焰图)的大部分运行时间。
我真的很想只调用.deparseOpts()
一次,然后将数字代码提供给deparse()
,但是如果不.Internal()
直接调用或调用C代码,这似乎是不可能的,从软件包开发的角度来看,这两种方法都不是最佳选择。
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>
有一个方便的解决方法吗?