Как из функции вернуть несколько data frame или по другому обойти ограничение на возврат одного результата в R?
Есть несколько фреймов
a <- c(1:4)
a <- as.data.table(a)
a[[1]] <- c(a:d)
a[[2]] <- c(15,20,30,35)
b <- c(1:4)
b <- as.data.table(b)
b[[1]] <- c(1:4)
b[[2]] <- c(15,30,35,20)
Хочу написать функцию, которая принимает список фреймов с названием фреймов (они всегда разные и их много)
s <- c("a","b")
и сортирует их одинаковым образом
baseSort(s,2,"d")
baseSort = function(list,indexColumn,sortType="a") {
SortTableName <- list[1]
.
код
.
}
Функция сортирует первый указанный фрейм по возрастанию или убыванию по одному из столбцов indexColumn = 2...n из первого фрейма в list. Где n - количество столбцов фрейма.
Первый столбец во всех фреймах одинаковый. Все указанные в list фреймы от 2-го и далее сортируются по первому столбцу в том-же порядке, что и первый столбец первого фрейма после сортировки по возрастанию или убыванию в предыдущем шаге.
Как вернуть результат из функции? Оптимально было бы отсортировать прям из функции a и b в globalenv() также, как они отсортированы внутри функции.
но ни
get(SortTableName) <- array1
ни
assign(get(SortTableName),array1)
не работают.
Нужно рабочее решение для R-3.5.2
Ответы (2 шт):
Любое количество таблиц можно отсорировать по одному и тому же столбцу, например, так:
library(data.table)
a <- data.table(a = c(2, 3, 1, 4), b = 1:4)
b <- copy(a)
ab <- list(a, b)
lapply(ab, function(x) setorder(x, a))
ab
Справился так: внутри функции распихал все фреймы из list по массивам
TablesCount <- length(list)
for (array in 1:TablesCount) {
assign(paste0("array",array),get_array(list[array]))
}
отсортированные фреймы схлопнул в один так, как нужно пакету zeallot:
result <- lapply(1:TablesCount, function(i) get(paste0("array",i)))
return(result)
Спасибо rg4s за подсказку. Вызываю функцию так, как прописано в документации по пакету:
c(a,b,c) %<-% lapply(baseSort(s,2,"a"),head,n=6)
Решение работает.
Очень хочется теперь избавится от лишнего параметра n=6 (сколько строк выдавать) и от выдачи через head(), но как это сделать непонятно.