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

时间:2012-11-24 05:41:44

标签: r function dataframe

是否可以从一个函数返回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个数据帧而不先将它们返回到列表中?

3 个答案:

答案 0 :(得分:21)

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

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

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

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

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

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

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

答案 1 :(得分:3)

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

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

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

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

换句话说

envir=parent.frame()

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

  

当你这样做时,小猫死了

答案 2 :(得分:0)

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()