Назначение функций в цикле for - PullRequest
1 голос
/ 15 апреля 2019

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

Я не уверен, что может происходить.

return_letter <- function(i){
  letters[i]
}


for(i in 1:3) {
  assign(paste0("fn_", i), function() return_letter(i))
}


fn_1() # expect "a", get "c"
fn_2() # expect "b", get "c"
fn_3() # expect "c", get "c"


rm(list = ls(pattern = "^fn_"))

Для контекста,пакет имеет дело с названиями цветов, и я хочу вернуть палитры для красных, синих, зеленых и т. д.

1 Ответ

1 голос
/ 15 апреля 2019

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

for(i in 1:3)
     eval(parse(text = paste0("fn_", i, " <- function()letters[", i, "]"))) #fixed mistake. Last i should be outside quotes.

Однако это кажется довольно неэффективным способом обработки выбора цвета.Пакет colourpicker, позволяет выбирать цвета через блестящий виджет.Можно найти интересный исходный код.

Если дело в том, чтобы хранить цвета, для использования в различных функциях (таких как блестящие виджеты), использование инкапсулированной среды или объекта может быть более безопасным или лучшим способом.В основном, хранение цветов в списке, так как цвета выбираются на потом.Использование объекта R6 или S4 (предыдущий в большинстве случаев проще и более интуитивно понятен для работы) будет одним из способов в этом случае.(Я бы предложил посмотреть и попробовать примеры из ?R6::R6Class в этом случае.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...