[英]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.