Как вы заявляете, у вас есть 2 цели: 1) Сортировать 1 фрейм данных и 2) повторить операцию с несколькими фреймами данных. Это хорошее разделение, которое позволяет вам разработать решение сначала для 1), а затем для 2).
Ваша функция почти на месте. Чтобы получить имена столбцов, используйте colnames
. Во-вторых, функции R не требуют оператора return
, а просто возвращают последнее значение. Это также очень распространенное руководство по стилю (по крайней мере, в пакетах tidyverse). В общем, ваша функция становится:
sortdf <- function(data) {
data[,sort(colnames(data))]
}
Для 2) вы можете либо объединить все свои фреймы данных в список, а затем использовать lapply:
lapply(list(D1, D2, D3), sortdf)
или вы можете создать вторую функцию, которая сделает это за вас. В любом случае, вы должны решить, как вы хотите, чтобы ваш вывод , так как и lapply
, и функция могут возвращать только один объект - оба мы можем связать любое количество тингов в один list
объект. Итак, давайте возьмем пометку и превратим ее в функцию:
sorter <- function(...) {
lapply(list(...), sortdf)
}
Здесь мы используем эллипсы ...
в качестве замены для любого числа аргументов, которые пользователь может захотеть бросить в функцию. В идеале это должно быть любое количество data.frame. Чтобы обработать набор переменных переменного размера, мы упаковываем его в список. Команда list(...)
создаст список с точно такими же аргументами, как мы назвали sorter
с помощью. Итак, давайте посмотрим на вывод из sorter
.
Единственная проблема заключается в том, что возвращаемый список не имеет имени. Что вы указали в какой аргумент? Я представляю здесь расширенную версию, которая называет вывод. Изучите его и посмотрите, понимаете ли вы, что происходит.
sorter <- function(...) {
m <- match.call()
ret <- lapply(list(...), sortdf)
if (is.null(names(ret))) {
names(ret) <- make.names(m[-1])
} else {
names(ret)[names(ret) == ''] <- make.names(m[-1])[names(ret) == '']
}
ret
}
data("mtcars")
D1 <- mtcars[,c('cyl','drat','wt','am','qsec')]
sorter(D1, mtcars)
sorter(D1, b=data.frame(b='b',a='a'))