У меня есть функция для выполнения действий с переменным списком фреймов данных в зависимости от выбора пользователя.Функция в основном выполняет общие действия, но есть несколько действий, которые зависят от данных.
Мой код работает нормально, если выбраны все кадры данных, но я не могу заставить его работать, если не все кадры данных выбраны.
Ниже приведен минимальный воспроизводимый пример:
# User switches.
df1Switch <- TRUE
df2Switch <- TRUE
df3Switch <- TRUE
# DF creation.
set.seed(1)
df <- data.frame(X=sample(1:10), Y=sample(11:20))
if (df1Switch) df1 <- df
if (df2Switch) df2 <- df
if (df3Switch) df3 <- df
# Function to do something.
fn_something <- function(file_list, file_names) {
df <- file_list
# Do lots of generic things.
df$Z <- df$X + df$Y
# Do a few specific things.
if (file_names == "Name1") df$X <- df$X + 1
else if (file_names == "Name2") df$X <- df$Z - 1
else if (file_names == "Name3") df$Y <- df$X + df$Y
return(df)
}
# Call function to do something.
file_list <- list(Name1=df1, Name2=df2, Name3=df3)
file_names <- names(file_list)
all_df <- do.call(rbind,mapply(fn_something, file_list, file_names,
SIMPLIFY=FALSE))
В этом случае код работает нормально, так как пользователь выбрал создание всех трех кадров данных.Я использую именованный список, чтобы конкретные действия могли выполняться с правильными кадрами данных.
Вывод выглядит примерно так (фактические числа не важны):
X Y Z
Name1.1 4 13 16
Name1.2 5 12 16
Name1.3 6 16 21
: : : :
Name2.1 15 13 16
: : : :
проблема возникает, если пользователь выбирает не создавать некоторые кадры данных, например:
# User switches.
df1Switch <- TRUE
df2Switch <- FALSE
df3Switch <- TRUE
Неудивительно, что в этом случае ошибка объекта не найдена:
> # Call function to do something.
> file_list <- list(Name1=df1, Name2=df2, Name3=df3)
Error: object 'df2' not found
Что я хотел быdo - условно указать содержимое file_list
в соответствии с этим псевдокодом:
file_list <- list(if (df1Switch) {Name1=df1}, if (df2Switch) {Name2=df2}, if (df3Switch) {Name3=df3})
Я встречал list.foldLeft
Условно объединить элементы списка , но я не знаюесли это подходит.