Создание переменного количества аргументов, функция

Как создать функцию, которая принимает неограниченное количество аргументов

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

list.max ‹- функция (список, ...)

где ... представляет разные столбцы из data.frames, которые находятся внутри списка.

Функция будет сравнивать элементы из столбцов, строку за строкой, и возвращать вектор с максимальным значением из всех.

Чтобы помочь процессу, я уже проделал некоторую работу. Это самое близкое, что я смог получить:

#function to return the maximum value from each line, between all the columns listed
#@Arg List: A list of data.frames which contain the columns
#@Arg col.name1 ... col.nameN: Character variable containing the names from the columns to compare
#Pre: The list must exist and the data.frames must contain the same columns
#Pos: The function will return a vector with their first element 
#  being the maximum value, between the columns listed, from the first 
#  data.frame from the list. The second element, being the maximum 
#  value between the columns listed, from the second data.frame from 
#  the list. The analogy continues until the N element

list.max <- function(list, col.name1, col.name2, ... , col.nameN){
   #creates the first data.frame with the correct amount of rows
   data.frame = data.frame(list.exapply(list, max, col.name1))

   #loop intill the end
   data.frame[1] = list.exapply(list, max,  col.name1)
   data.frame[2] = list.exapply(list, max, col.name2)
    ...
   data.frame[N] = list.exapply(list, max, col.nameN)

   #transpose the data.frame, so it can be compared in the max function, as he is casted to a matrix class
   t(data.frame)

   #creates the vector so it can storage the max value between the columns (which are now the lines)
   vet = vector()

   #storage the solution
   for( i in 1:nrow(data.frame)) {vet[i] = max(data.frame[i,])}

   #return the solution
   return (vet)
}

Вспомогательные функции, использованные выше, таковы:

df.exapply <- function(data.frame, func, col.name){
  variavel <-func(data.frame[, col.name])
  # print(variavel)
  return (variavel)
}

list.exapply <- function(list, func, col.name){
  vet = df.exapply(list[[1]], func, col.name)
  # print(col.name)
   for (i in 1:length(list)) { vet[i] = df.exapply(list[[i]],func, col.name)
                      }
  return (vet)
}

Заранее спасибо за помощь!


person Homunculus    schedule 24.08.2017    source источник
comment
Почему бы вам не сделать это 2 списка? 1 для data.frames и один для столбцов, второй список также может быть просто массивом   -  person mRcSchwering    schedule 24.08.2017
comment
Простите, а что дальше? Я не понял функциональность, делая это. Кроме того, когда вы говорите список столбцов, вы имеете в виду имена столбцов или сами столбцы? Потому что, если вы говорите о самих колонках, то почему это выгодно, если у меня уже есть эта информация в первом списке?   -  person Homunculus    schedule 24.08.2017


Ответы (1)


Итак, из того, что я собрал, вы хотите иметь список с x кадрами данных и найти максимальное значение всех наблюдений и всех переменных в каждом кадре данных. Почему бы вам не сделать следующее:

# Create list with 10 dataframes
df_list <- list()
for (i in 1:10) {
  df_list[[i]] <- data.frame(matrix(rnorm(100), ncol = 10))
  colnames(df_list[[i]]) <- LETTERS[1:10]
}

# Find maximum value of all data.frames
sapply(df_list, FUN = max)

Это создает список с 10 кадрами данных, каждый с 10 наблюдениями и 10 переменными. Затем он перебирает каждый data.frame, чтобы получить максимальное значение каждого из них. В конце возвращается вектор с максимальными значениями.

person Stanislaus Stadlmann    schedule 24.08.2017