Tôi duy trì một gói dựa trên các cuộc gọi lặp đi lặp lại deparse(control = c("keepNA", "keepInteger"))
. control
luôn luôn giống nhau, và biểu thức khác nhau. deparse()
dường như dành nhiều thời gian để lặp đi lặp lại việc diễn giải cùng một bộ tùy chọn với .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
Trên một số hệ thống, các .deparseOpts()
cuộc gọi dự phòng thực sự chiếm phần lớn thời gian chạy của deparse()
( biểu đồ ngọn lửa ở đây ).
Tôi thực sự chỉ muốn gọi .deparseOpts()
một lần và sau đó cung cấp mã số deparse()
, nhưng điều đó dường như là không thể nếu không gọi .Internal()
hoặc gọi trực tiếp mã C, cả hai đều không tối ưu theo quan điểm phát triển gói.
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ó một cách giải quyết thuận tiện?