Как a может попытаться выполнить вызов для переименования и возврата результатов, даже если есть ошибка?

#r

#r

Вопрос:

Я хотел бы выполнить итерацию по списку фреймов данных с помощью функции переименования. Иногда DFs будет иметь значение NULL.

 lookup <- list(
  'miles_per_gallon' = 'mpg',
  'cylinder' = 'cyl'
)


df1 <- mtcars
df2 <- NULL

index_name <- function(df, lookup) {
  i1 <- unlist(lookup) %in% names(df)
  names_lookup_sub <- lookup[i1]
  df %>% rename(!!! lookup[i1])
}

   
 

Теперь вводим функцию в действие:

 df1 %>% {try(index_name(.,lookup))} %>% glimpse # works! Note the newly named features
Rows: 32
Columns: 11
$ miles_per_gallon <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8, 16.4, 17.3, 15.2, 10.4, 10.4, 14$ cylinder         <dbl> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 4, 4, 4, 8, 6, 8, 4
$ disp             <dbl> 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7, 140.8, 167.6, 167.6, 275.8, 275.8, 275.8,$ hp               <dbl> 110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 180, 205, 215, 230, 66, 52, 65, 97,$ drat             <dbl> 3.90, 3.90, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92, 3.07, 3.07, 3.07, 2.93, 3.00, 3.$ wt               <dbl> 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, 3.570, 3.190, 3.150, 3.440, 3.440, 4.070, 3.730, 3.780,$ qsec             <dbl> 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20.00, 22.90, 18.30, 18.90, 17.40, 17.60, 18.00,$ vs               <dbl> 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1
$ am               <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1
$ gear             <dbl> 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5, 4
$ carb             <dbl> 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2, 2, 4, 2, 1, 2, 2, 4, 6, 8, 2
 

Но при попытке с НУЛЕВЫМ DF:

 df2 %>% {try(index_name(.,lookup))} %>% glimpse # error in UseMethod("rename_") : no applicable method for 'rename_' applied to an object of class "NULL"
 

Как я могу применить свою функцию к нескольким фреймам данных и применить функцию там, где существует df, и в противном случае передать ее без выдачи ошибки?

Ответ №1:

Внутри вашей функции используйте оператор if, проверяющий наличие нулевых фреймов данных:

 index_name <- function(df, lookup) {
  if (!is.null(df)) {
    i1 <- unlist(lookup) %in% names(df)
    names_lookup_sub <- lookup[i1]
    df %>% rename(!!! lookup[i1])
  }
}
 

Ответ №2:

Вы можете использовать пакет purrr для создания «безопасной» функции. Он вернет список с 2 содержимым: результат и ошибка. Если ошибка не возникает, результат будет сохранен в result , в противном случае в error .

Шаг 1) Превращение вашей функции в безопасную функцию

 library(purrr)
safely_index_name <- purrr::safely(.f = ~index_name(.x,lookup))
 

Шаг 2) Применение вашей функции к нескольким входам (df1 и df2, то есть) с помощью purrr::map

 df_list <- list(df1, df2)

df_renamed <- purrr::map(df_list, safely_index_name) %>% 
  purrr::transpose()

df_renamed$result