【问题标题】:In R, how can I append new information to S4 objects from a function?在 R 中,如何将新信息从函数附加到 S4 对象?
【发布时间】:2017-10-13 19:58:30
【问题描述】:

我将一个代表变量名的字符串传递给一个函数。本质上我想向变量添加新信息,我遇到的问题是它实际上并没有将新信息附加到 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 function object data-structures s4


【解决方案1】:

简而言之,点符号在 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 对象如何工作的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2019-10-16
    • 1970-01-01
    • 2023-03-15
    • 2020-05-19
    相关资源
    最近更新 更多