我想从一个函数在全局环境中创建一个 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
。