Вывести команду mapply для возврата списка?

Предположим, что у меня есть функция, которая создает кадры данных. Я хотел бы запустить эту функцию с различными входными значениями, а затем объединить результаты вместе в один большой фрейм данных, как показано ниже:

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

Моя функция CreateDataFrame принимает три аргумента. В приведенном выше примере второй и третий аргументы сохраняются постоянными. Я хотел бы сделать то же самое, что и выше, но при каждом вызове изменить второй и третий аргументы. Я думаю, что мне нужно использовать mapply, например:

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

У меня проблемы, потому что mapply не возвращает список, что мешает мне запустить do.call(rbind, mapply(...)). Как я могу получить один кадр данных, как это было в примере вверху?

Похоже, что mapply возвращает матрицу списков. Я ожидал, что он вернет список кадров данных. Что мне делать по-другому?

Ответы

Ответ 1

Чтобы получить список data.frames в качестве возвращаемого значения, установите аргумент mapply SIMPLIFY в FALSE. (Его значение по умолчанию - TRUE, которое направляет функцию "пытаться уменьшить результат до матрицы вектора, матрицы или более высокого размера" - именно то, что вы испытали).

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

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

Ответ 2

Альтернативу вы можете использовать функцию Map. Это, в основном, mapply, когда параметр SIMPLIFY установлен в FALSE.

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