R对象的名称包含多个功能

jam*_*mse 4 r r-s3 nse

根据我对Hadley关于构建S3对象的建议的阅读,我使用了辅助函数,构造函数和验证器函数.一个简单的可重复的例子:

test_object <- function(x, y, z) {
    new_test_object(x, y, z)
}

new_test_object <- function(x, y, z) {
    structure(list(x = x,
                   y = y,
                   z = z,
                   x_name = deparse(substitute(x))),
              class = "test_object")
}

validate_test_object <- function(test_object) {
    # Anything goes
    test_object
}
Run Code Online (Sandbox Code Playgroud)

我希望生成的对象包含一个值,该值包含传入项的原始名称($x_name在上面的示例中).deparse(substitute(...))如果我直接调用构造函数,这个技巧就有效:

alpha = "a"
test_constructor <- new_test_object(x = alpha, y = "b", z = "c")
test_constructor$x_name
# [1] "alpha"
Run Code Online (Sandbox Code Playgroud)

但是如果我使用辅助函数则不行:

test_helper <- test_object(x = alpha, y = "b", z = "c")
test_helper$x_name
# [1] "x"
Run Code Online (Sandbox Code Playgroud)

我也想test_helper$x_name回来[1] "alpha".

如果没有deparse(substitute(...))在辅助阶段执行该步骤,那么构造函数function(new_test_object())x是否可以通过帮助程序访问对象的"原始"名称?或者当helper函数将其传递给构造函数时,确保其名称与其一起传递?

MrF*_*ick 5

这里的目的是什么?如果你只是使用一个函数作为另一个函数的包装器,那么有更好的方法来保存参数.例如

test_object <- function(x, y, z) {
  call <- match.call()
  call[[1]]  <- quote(new_test_object)
  eval(call)
}
Run Code Online (Sandbox Code Playgroud)

但总的来说,依靠deparse()从变量名称获取信息并不是一种非常可靠的方法.如果您愿意,最好将这些信息作为适当的参数设置.这使您的功能更加灵活.

test_object <- function(x, y, z, xname=deparse(substitute(x))) {
    new_test_object(x, y, z, xname=xname)
}

new_test_object <- function(x, y, z, xname=deparse(substitute(x))) {
    structure(list(x = x,
                   y = y,
                   z = z,
                   x_name = xname),
              class = "test_object")
}
Run Code Online (Sandbox Code Playgroud)