簡體   English   中英

在函數中返回不同的數據幀 - R

[英]returning different data frames in a function - R

是否可以從一個函數返回 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 不支持多個返回值。 你想做這樣的事情:

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

是的? 嗯,你不能。 您收到 R 無法返回多個值的錯誤。

您已經找到了解決方案 - 將它們放在一個列表中,然后從列表中獲取數據框。 這是有效的 - 沒有將數據幀從一個內存塊轉換或復制到另一個內存塊。

這也是合乎邏輯的,從概念上講,函數的返回應該是一個具有某種含義的單個實體,該實體將轉移到調用它的任何函數。 如果您命名列表的返回值,也可以更好地傳達此含義。

您可以使用一種技術在調用環境中創建多個對象,但是當您這樣做時,小貓就會死亡。

請注意,在您的示例中carYear不是數據框 - 它是列名稱的字符向量。

如果您真的想要,在 R 中還有其他方法可以做到這一點。

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

如果使用它,則將在調用環境中創建 carFile。 正如 Spacedman 所指出的,你只能從你的函數中返回一件事,干凈的解決方案是去列表。

另外,我個人的觀點是,如果您發現自己處於這樣一種情況,您覺得需要用一個函數返回多個數據幀,或者做一些以前沒有人做過的事情,那么您真的應該重新審視自己的方法。 在大多數情況下,您可能會找到帶有附加功能或推薦(即列表)的更簡潔的解決方案。

換句話說

envir=parent.frame()

會做這項工作,但正如 SpacedMan 提到的

當你這樣做時,小貓會死

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM