Force mapply to return a list?

China☆狼群 提交于 2019-11-26 17:47:09

问题


Suppose I have a function that creates data frames. I'd like to run that function with different input values, and then rbind the results together into one big data frame, as below:

CreateDataFrame <- function(type="A", n=10, n.true=8) {
  data.frame(success=c(rep(TRUE, n.true), rep(FALSE, n - n.true)), type=type)
}
df <- do.call(rbind, lapply(toupper(letters[1:5]), CreateDataFrame))

My CreateDataFrame function takes three arguments. In the example above, the second and third arguments are held constant. I'd like to do the same as above, but have the second and third arguments change on each call. I think I have to use mapply, like this:

mapply("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4)

I'm having trouble because mapply isn't returning a list, which prevents me from running do.call(rbind, mapply(...)). How can I end up with a single data frame, as I did in the example at the top?

Looks like mapply is returning a matrix of lists. I was expecting it to return a list of data frames. What should I do differently?


回答1:


To get a list of data.frames as the return value, set mapply's SIMPLIFY argument to FALSE. (Its default value is TRUE, which directs the function to "attempt to reduce the result to a vector, matrix or higher dimensional array" -- just what you experienced).

res <- mapply("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4, 
              SIMPLIFY = FALSE)

identical(class(res), "list")
[1] TRUE



回答2:


Alternative you can use the Map function. It is basically mapply with SIMPLIFY set to FALSE.

Map("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4)


来源:https://stackoverflow.com/questions/8733650/force-mapply-to-return-a-list

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!