関数からグローバル環境で S3 ジェネリックを作成したいと考えています。私は見R.methodsS3::setGenericS3.default
て、次のことを思いつきました:
create_generic <- function(nm) {
src <- sprintf("%s <- function(obj, ...) UseMethod(\"%s\")", nm, nm)
expr <- parse(text = src)
print(expr)
eval(expr, env = .GlobalEnv)
}
create_generic("cat")
#> expression(cat <- function(obj, ...) UseMethod("cat"))
cat
#> function (obj, ...)
#> UseMethod("cat")
これは私が望むように機能します。ただし、引用を使用してこれを機能させようとしてきましたが、行き詰まっています:
library(rlang)
create_generic2 <- function(nm) {
expr <- expr(!!sym(nm) <- function(obj, ...) UseMethod(!!nm))
print(expr)
eval(expr, env = .GlobalEnv)
}
create_generic2("dog")
#> dog <- function(obj, ...) UseMethod("dog")
dog
#> function(obj, ...) UseMethod(!!nm)
これはtidyeval
私がよく知っているので利用しますが、ベースRでこれがどのように見えるかを知りたい.
での文字列操作なしで動作するこのバージョンに興味がありますcreate_generic
。