在 R 中,如何从函数向 S4 对象附加新信息?

In R, how can I append new information to S4 objects from a function?

我正在将表示变量名称的字符串传递给函数。本质上我想向变量添加新信息,我遇到的问题是它实际上并没有将新信息附加到 S4 对象,它只是创建了一个 myObjName.newinfo 的新变量,它实际上与原始对象。

以下是我目前尝试过的方法。

myS4 <- makeSomeS4()


myFunction <- function(myS4name)
{
    #Get the actual s4 object based on the variable name.
    res <- get(myS4name)

    #Make sure they're passing us the correct type of object.
    try(if(typeof(res) != "S4") stop("Error: extract_res_data requires S4 type object as result set for parameter res."))

    #I've tried this way with eval.
    myNum = 5
    myNum_assign <- paste(myS4name, ".myNum", " <<- ", myNum, sep="")
    eval(parse(text=myNum_assign))

    #I've tried this way with assign.
    myNum = 5
    myNum_assign = paste(resName, ".myNum", sep="")
    assign(myNum_assign, myNum, envir = .GlobalEnv)

}

所以现在我可以运行这个功能,然后说

> myFunction("myS4")
> myS4.myNum
    5

乍一看没问题,但实际上myS4.myNum是它自己的变量,与myS4无关。所以如果我稍后将 myS4 传递给另一个函数,然后尝试访问 .myNum,它不存在。

如何正确地将新值附加到 S4?它并不总是简单的数据集,有时我需要附加数据框或列表等。

感谢任何人提供的帮助。

简而言之,点符号在 R 中不是这样工作的。在 R 中,点是变量名和函数的完全有效部分,就像下划线一样。当您为 myS4.myNum 赋值时,您只是在创建一个具有该名称的新变量,正如您发现的那样。

以下是 S4 槽如何使用的简短示例:

setClass("my_class", representation(my_val = "numeric"))
my_object <- new("my_class")
my_object@my_val <- 5

但是还有更多内容,超出了 SO 答案的范围。查看 http://adv-r.had.co.nz/S4.html 等,了解有关 S4 对象如何工作的更多信息。