Как из функции вернуть несколько 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 шт):

Автор решения: Ogurtsov

Любое количество таблиц можно отсорировать по одному и тому же столбцу, например, так:

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
→ Ссылка
Автор решения: Mikhail M. Gorbunov

Справился так: внутри функции распихал все фреймы из 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(), но как это сделать непонятно.

→ Ссылка