【问题标题】:Returning multiple objects in an R function [duplicate]在R函数中返回多个对象[重复]
【发布时间】:2012-02-14 16:55:13
【问题描述】:

如何在 R 函数中返回多个对象?在 Java 中,我会创建一个类,可能是 Person,它有一些私有变量并封装,可能是 heightage 等。

但在 R 中,我需要传递数据组。例如,如何让 R 函数既返回字符列表又返回整数?

【问题讨论】:

  • 我认为这对于来自其他语言的人来说可能并不直观,但列表是做到这一点的方式。所以你会有一个包含两个元素的列表:一个列表和一个整数。
  • 这个问题和this one非常相似。那里有一些不同的答案。
  • 比起the other question,我更喜欢这里的问题标题问题正文答案作为副本。

标签: r function


【解决方案1】:

与许多其他语言不同,严格意义上的 R 函数不会返回多个对象。最通用的处理方法是返回一个list 对象。因此,如果您的函数中有一个整数 foo 和一个字符串向量 bar,您可以创建一个组合这些项目的列表:

foo <- 12
bar <- c("a", "b", "e")
newList <- list("integer" = foo, "names" = bar)

然后return 这个列表。

调用您的函数后,您可以使用newList$integernewList$names 访问其中的每一个。

其他对象类型可能更适合各种用途,但list 对象是一个很好的入门方法。

【讨论】:

【解决方案2】:

您正在寻找这些方面的东西吗?

x1 = function(x){
  mu = mean(x)
  l1 = list(s1=table(x),std=sd(x))
  return(list(l1,mu))
}

library(Ecdat)
data(Fair)
x1(Fair$age)

【讨论】:

    【解决方案3】:

    与 Java 类似,您可以在 R 中创建一个封装您的信息的 S4 类:

    setClass(Class="Person",
             representation(
                height="numeric",
                age="numeric"
              )
    )
    

    那么你的函数可以返回这个类的一个实例:

    myFunction = function(age=28, height=176){
      return(new("Person",
              age=age,
              height=height))
    }
    

    您可以访问您的信息:

    aPerson = myFunction()
    
    aPerson@age
    aPerson@height
    

    【讨论】:

    • 只是在这里学习...当您显然已经用myFunction = function(age=28, height=176){... 定义了年龄和身高时,返回aPerson@ageaPerson@height 之类的内容什么时候有用。我只是不明白(即,为什么这是有用的)。因此,您已经实例化了您的类,然后您想了解有关该实例的详细信息。但是既然你已经实例化了这个类,你难道不知道这些细节吗?
    • @warship 这只是一个解释如何返回对象的虚拟示例。我构建对象的方式在这里并不重要。我们还可以让 myFunction 根据其他参数计算年龄和身高。
    • 好的,非常感谢。我只是想了解更多有关在 R(S3、S4 等)中进行 OOP 以及何时有用的知识。
    【解决方案4】:

    您可以使用for()assign() 来创建许多对象。 见assign()的例子:

    for(i in 1:6) { #-- Create objects  'r.1', 'r.2', ... 'r.6' --
        nam <- paste("r", i, sep = ".")
        assign(nam, 1:i)
    

    寻找新对象

    ls(pattern = "^r..$")
    

    【讨论】:

      【解决方案5】:

      你也可以使用超级赋值。

      而不是“

      【讨论】:

        【解决方案6】:

        处理此问题的一种方法是将信息作为属性放在主要属性上。我必须强调,我真的认为只有当这两条信息相关,以至于一个有关于另一个的信息时,这样做才是合适的。

        例如,我有时会通过将变量名称列表存储为数据框上的属性来隐藏“关键变量”或已被显着修改的变量的名称:

        attr(my.DF, 'Modified.Variables') <- DVs.For.Analysis$Names.of.Modified.Vars
        return(my.DF)
        

        这使我可以将变量名称列表与数据框本身一起存储。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-12
          • 1970-01-01
          • 1970-01-01
          • 2015-06-22
          相关资源
          最近更新 更多