#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:
-
Объекты, измененные в функции, не отражаются в глобальной среде, если вы не используете
<<-
илиassign
, что в любом случае не рекомендуется. -
Вы можете свернуть
regex_input
в одну строку, чтобы избежать использованияfor
цикла. -
Нет необходимости в
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
изменить значение из функции.