Я провел несколько тестов, чтобы попытаться выяснить ответ, и я думаю, что он будет очень противоречивым.
Прежде всего, если вы прочитаете документацию для InternalMethods
, вы увидитеследующие:
Следующие примитивные и внутренние функции являются общими, т. е. вы можете написать методы для них
Таким образом, вы можете иметь примитивные функции, которыеявляются общими.
Вот некоторые из моих тестов, хотя я сомневаюсь, что они являются исчерпывающими.
library(rlang)
setClass("Foo", list(x="numeric"))
foo <- new("Foo", x=0)
Сначала я попытался определить метод $
, который уже использует цитаты для списков ифреймы данных:
setMethod("$", signature(x="Foo"), function(x, name) {
enquo(name)
})
foo$x
<quosure>
expr: ^"x"
env: empty
По какой-то причине определенный нами универсал автоматически меняет name
на символ, но, возможно, вы можете просто использовать sym
и затем продолжить.
Тогда я хотелчтобы увидеть, что происходит с дженериками, которые содержат многоточие:
setMethod("predict", signature(object="Foo"), function(object, ...) {
enquos(...)
})
predict(foo, bar, baz=bak)
<list_of<quosure>>
[[1]]
<quosure>
expr: ^bar
env: global
$baz
<quosure>
expr: ^bak
env: global
Никаких сюрпризов (?)
Затем я попытался определить [
, который имеет несколько формальных аргументов и ...
:
setMethod("[", signature(x="Foo"), function(x, i, j, ..., drop=TRUE) {
enquos(i, j, ...)
})
foo[bar, , baz, bak]
<list_of<quosure>>
[[1]]
<quosure>
expr: ^bar
env: global
[[2]]
<quosure>
expr: ^
env: empty
[[3]]
<quosure>
expr: ^baz
env: global
[[4]]
<quosure>
expr: ^bak
env: global
Кажется, работает как экс, хотя я не уверен, что делать с пустым предложением, оно не ведет себя как отсутствующий аргумент:
f <- function(x) {
print(missing(x))
ff <- function(xx) { missing(xx) }
eval_tidy(ff(!!enquo(x)))
}
f()
[1] TRUE
[1] FALSE
Наконец я попытался добавить формальный аргумент к методу [
:
setMethod("[", signature(x="Foo"), function(x, i, j, k, ..., drop=TRUE) {
enquos(i, j, k, ...)
})
foo[bar, , baz, bak]
<list_of<quosure>>
[[1]]
<quosure>
expr: ^i
env: 000001FCA36865F0
[[2]]
<quosure>
expr: ^j
env: 000001FCA36865F0
[[3]]
<quosure>
expr: ^baz
env: global
[[4]]
<quosure>
expr: ^bak
env: global
И я не знаю, является ли это поведение ошибкой, функцией или чем-то еще.