【问题标题】:returned objects within a list while keeping the original data structure in R在列表中返回对象,同时在 R 中保留原始数据结构
【发布时间】:2014-04-10 21:28:22
【问题描述】:

在 R 中,我需要从一个函数中返回两个对象:

myfunction()
{
 a.data.frame <- read.csv(file = input.file, header = TRUE, sep = ",", dec = ".")
 index.hash <- get_indices_function(colnames(a.data.frame))

 alist <- list("a.data.frame" = a.data.frame, "index.hash" = index.hash)

 return(alist)
}

但是,从 myfunction 返回的对象都变成了列表而不是 data.frame 和散列。

任何帮助将不胜感激。

【问题讨论】:

    标签: r list function


    【解决方案1】:

    R 函数只能返回一个对象;这与我使用过的几乎所有其他语言一致。但是,您会注意到对象在列表保留了它们的原始结构 - 所以 alist[[1]] 和 alist[[2]] 应该分别是数据框和散列,并且是结构化的as 数据帧和散列。从函数中返回它们后,您可以根据需要将它们拆分为唯一的对象:)。

    【讨论】:

      【解决方案2】:

      您可以使用structure

      return (structure(class = "myclass",
                         list(data = daza.frame,
                              type = anytype,
                              page.content = page.content.as.string.vector,
                              knitr = knitr)))
      

      比你可以访问你的数据

      values <- my function(...)
      values$data
      values$type
      values$page.content
      values$knitr
      

      等等。

      我的包中的一个工作示例:

      sju.table.values <- function(tab, digits=2) {
        if (class(tab)!="ftable") tab <- ftable(tab)
        tab.cell <- round(100*prop.table(tab),digits)
        tab.row <- round(100*prop.table(tab,1),digits)
        tab.col <- round(100*prop.table(tab,2),digits)
        tab.expected <- as.table(round(as.array(margin.table(tab,1)) %*% t(as.array(margin.table(tab,2))) / margin.table(tab)))
        # -------------------------------------
        # return results
        # -------------------------------------
        invisible (structure(class = "sjutablevalues",
                             list(cell = tab.cell,
                                  row = tab.row,
                                  col = tab.col,
                                  expected = tab.expected)))
      }
      
      tab <- table(sample(1:2, 30, TRUE), sample(1:3, 30, TRUE))
      # show expected values
      sju.table.values(tab)$expected
      # show cell percentages
      sju.table.values(tab)$cell
      

      【讨论】:

      • 我完全不知道你在做什么。你为什么使用structure?与仅返回 list 相比,它似乎没有任何优势。您的所有示例都可以正常工作。
      • 你是对的,这两种方法似乎都是可行的。但是,对我来说,这也是“编码风格”的问题,使用结构具有分配属性的优势(请参阅adv-r.had.co.nz/Data-structures.html),根据我的经验,这通常在返回值时用于包函数中。
      • 然而,它的缺点是更加模糊。出于某种原因,列表几乎是这项任务的标准。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      • 2023-02-18
      相关资源
      最近更新 更多