我在rlang和base之间遇到了意外的行为差异。正如此报价所证明的,显然存在差异。这是从0.4.1开始的,但是类似的语言仍然是0.4.2,现在改为指enquo
。
就基本函数而言,enexpr(arg)对应于base :: substitute(arg)(尽管该函数还具有复杂的替换语义)
substitute()
具有的rlang函数来匹配行为吗?enexpr()
为什么不起作用有很好的解释吗?我猜是因为它与S3方法分派有关。我的例子是胡说,但我要强调的是,我无法捕获作为通用S3函数的第一个参数传入的表达式(在本例中为单个符号df
。)>
library(rlang)
f <- function(obj) {
enexpr(obj)
}
print(f(print("hello")))
#> print("hello")
# behavior matches expectations
df <- data.frame(a = 1:5, b = letters[1:5])
class(df) <- c("custom", class(df))
`[.custom` <- function(x, i) {
call2(expr(`[`), enexpr(x), i)
}
df[4]
#> list(a = 1:5, b = 1:5)[4]
sloop::s3_dispatch(df[4])
#> => [.custom
#> * [.data.frame
#> [.default
#> * [ (internal)
# It's dispatching as expected, but I don't get
# `df[4]` back as a call.
df <- data.frame(a = 1:5, b = letters[1:5])
class(df) <- c("custom", class(df))
`[.custom` <- function(x, i) {
call2(expr(`[`),substitute(x), i)
}
df[4]
#> df[4]
# substitute works
packageVersion("rlang")
#> [1] '0.4.2'
# Created on 2019-12-05 by the reprex package (v0.3.0)
我在rlang和base之间遇到了意外的行为差异。正如此报价所证明的,显然存在差异。这是从0.4.1开始的,但是现在类似语言仍在0.4.2,现在...
这是documented issue的rlang
,将来的版本中可能会添加支持。