Почему функция R, которую я создал, выдала неправильный результат?

#r #function

#r #функция

Вопрос:

Я создал функцию R, которая выдает неверный вывод. Вот упрощенная версия:

 # Dataset
test <- data.frame( color = c("blue", "green", "black", "white", "gray", "purple"))
test$color <- as.character(test$color)

# Build function to recode values which matches the input into a new output
fun_recode <- function(regex_input, regex_output) {
     reg_start <- ".*"
     reg_end <- ".*"
     index <- vector()
     for (i in 1:length(regex_input))  {
          index_1 <- grep(pattern = paste0(reg_start, regex_input[i], reg_end), x = test$color)
          index <- c(index, index_1)
     }
     test[index, ] <- regex_output
}

# Set arguments
regex_input <- c("a", "y")
regex_output <- "GOT IT!"

# Call function
fun_recode(regex_input, regex_output)
  

Я получаю этот вывод (примечание изменено):

введите описание изображения здесь

Правильный вывод должен быть:

введите описание изображения здесь

Пожалуйста, сообщите, что не так с моей функцией. Заранее спасибо.

Ответ №1:

  1. Объекты, измененные в функции, не отражаются в глобальной среде, если вы не используете <<- или assign , что в любом случае не рекомендуется.

  2. Вы можете свернуть regex_input в одну строку, чтобы избежать использования for цикла.

  3. Нет необходимости в reg_start и reg_end . Кроме того, лучше явно передать dataframe в функцию.

Попробуйте эту функцию :

 fun_recode <- function(data, regex_input, regex_output) {
  data$color[grep(paste0(regex_input, collapse = "|"), data$color)] <- regex_output
  return(data)
}

# Set arguments
regex_input <- c("a", "y")
regex_output <- "GOT IT!"

# Call function
test1 <- fun_recode(test,regex_input, regex_output)
test1
#    color
#1    blue
#2   green
#3 GOT IT!
#4   white
#5 GOT IT!
#6  purple
  

Итак, то, что неправильно в вашей функции, — это пункт 1. Изменение, внесенное в функцию, остается в функции. Вам нужно return изменить значение из функции.