在函数中返回不同的数据帧 - R

Posted

技术标签:

【中文标题】在函数中返回不同的数据帧 - R【英文标题】:returning different data frames in a function - R 【发布时间】:2012-11-12 09:10:11 【问题描述】:

是否可以从一个函数返回 4 个不同的数据帧?

场景:

我正在尝试读取文件、解析它并返回文件的某些部分。

我的函数看起来像这样:

parseFile <- function(file)

     carFile <- read.table(file, header=TRUE, sep="\t")

     carNames <- carFile[1,]
     carYear  <- colnames(carFile)

     return(list(carFile,carNames,carYear))

我不想使用 list(carFile,carNames,carYear)。有没有办法在不先将它们返回列表的情况下返回 3 个数据帧?

【问题讨论】:

您是否有特殊原因要避免使用列表? 投反对票是含糊而有用的。解释你正在尝试什么以及为什么一个列表不合适。 我想要三个不同的数据框,以便继续进行其他分析。如果我作为列表返回,我需要访问列表并将列表中的每个元素转换为数据框。我只是想知道这在 R 中是否可行。 carFile 已经是一个数据框。如果这是您想要的,您可以在将它们返回列表之前将它们转换为数据框。 【参考方案1】:

R 不支持多个返回值。你想做这样的事情:

foo = function(x,y)return(x+y,x-y)
plus,minus = foo(10,4)

是吗?好吧,你不能。您会收到 R 无法返回多个值的错误。

您已经找到了解决方案 - 将它们放在一个列表中,然后从列表中获取数据框。这是有效的 - 没有数据帧从一个内存块到另一个内存块的转换或复制。

这也是合乎逻辑的,一个函数的返回在概念上应该是一个具有某种含义的单一实体,该实体被转移到调用它的任何函数。如果您命名列表的返回值,也可以更好地传达此含义。

您可以使用一种技术在调用环境中创建多个对象,但是当您这样做时,小猫会死。

请注意,在您的示例中 carYear 不是数据框 - 它是列名的字符向量。

【讨论】:

例子在这里***.com/questions/17697239/…【参考方案2】:

如果你真的想要,在 R 中还有其他方法可以做到这一点。

assign('carFile',carFile,envir=parent.frame())

如果你使用它,那么 carFile 将在调用环境中创建。正如 Spacedman 所指出的,您只能从您的函数中返回一件事,而干净的解决方案是查看列表。

另外,我个人的看法是,如果你发现自己处于这样一种情况,你觉得你需要用一个函数返回多个数据帧,或者做一些以前没有人做过的事情,你真的应该重新审视你的方法。在大多数情况下,您可能会找到具有附加功能或推荐(即列表)的更清洁的解决方案。

换句话说

envir=parent.frame()

将完成这项工作,但正如 SpacedMan 所提到的

当你这样做时,小猫会死

【讨论】:

【参考方案3】:

zeallot 包可以满足您的需要,类似于 Python 可以从函数中解包变量。下面的可重现示例。

parseFile <- function()

  carMPG <- mtcars$mpg
  carName <- rownames(mtcars)
  carCYL <- mtcars$cyl

  return(list(carMPG,carName,carCYL))


library(zeallot)
c(myFile, myName, myYear) %<-% parseFile()

【讨论】:

以上是关于在函数中返回不同的数据帧 - R的主要内容,如果未能解决你的问题,请参考以下文章

R如何排列数据帧的所有行,以便在列表中返回所有可能的行组合?

C函数调用过程原理及函数栈帧分析(转)

使用 lapply 返回环境中的数据帧

如何从power bi中的python函数返回单个数据帧

r Shiny renderdatatable 转置数据帧问题

从具有数据帧格式的函数返回两个数据帧