1

関数からグローバル環境で 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

4

2 に答える 2