简体   繁体   中英

Is there a way to return two separate lists from one function?

I have a data frame which looks like this

value <- c(1:1000)
group <- c(1:5)
df <- data.frame(value,group)

And I want to use this function on my data frame

myfun <- function(){
  wz1 <- df[sample(nrow(df), size = 300, replace = FALSE),]
  wz2 <- df[sample(nrow(df), size = 10, replace = FALSE),]
  wz3 <- df[sample(nrow(df), size = 100, replace = FALSE),]
  wz4 <- df[sample(nrow(df), size = 40, replace = FALSE),]
  wz5 <- df[sample(nrow(df), size = 50, replace = FALSE),]

  wza <- rbind(wz1,wz2, wz3, wz4, wz5)
  wza_sum <- aggregate(wza, by = list(group_ID=wza$group), FUN = sum)
  return(list(wza = wza,wza_sum = wza_sum))
}

Right now I am returning one list which includes wza and wza_sum.

Is there a way to return two separate list in which one contains wza and the other list contains wza_sum?

The aggregate() function needs to be in myfun() because I want to replicate myfun() 100 times using

dfx <- replicate(100,myfun(),simplify = FALSE,)

A function should take one input (or set of inputs), and return only one output (or a set of outputs). Consider the simple example of

myfunction <- function(x) {
  x
  x ** 2
}

Unless you are calling return() early ( which you usually don't ), the last object is returned. In fact, if you try to return two objects, eg return(1,2) you are met with

Error in return(1, 2) : multi-argument returns are not permitted

That is why the solution proposed by @StupidWolf in the comments is the most appropriate one, where you use return(list(wza = list(wza),wza_sum = list(wza_sum))) . You then have to perform the necessary post-processing of splitting the lists if appropriate.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM