への繰り返しの呼び出しに依存するパッケージを維持しています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>
便利な回避策はありますか?