用于S3调度的捕获参数表达式

问题描述 投票:2回答:1

我在rlang和base之间遇到了意外的行为差异。正如此报价所证明的,显然存在差异。这是从0.4.1开始的,但是类似的语言仍然是0.4.2,现在改为指enquo

就基本函数而言,enexpr(arg)对应于base :: substitute(arg)(尽管该函数还具有复杂的替换语义)

  1. 任何人都可以使用substitute()具有的rlang函数来匹配行为吗?
  2. 关于enexpr()为什么不起作用有很好的解释吗?我猜是因为它与S3方法分派有关。
  3. 我对如何使用rlang做到这一点特别感兴趣,我已经可以仅使用base来实现我想要的行为。

我的例子是胡说,但我要强调的是,我无法捕获作为通用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,现在...

r rlang tidyeval
1个回答
0
投票

这是documented issuerlang,将来的版本中可能会添加支持。

© www.soinside.com 2019 - 2024. All rights reserved.