Функция манипуляции с переменным количеством элементов управления - PullRequest
1 голос
/ 19 апреля 2020

Моя цель - иметь функцию, которую можно вызывать с массивом наборов данных n . Эта функция вызовет manipulate и создаст график с блоком управления. В этом поле будет столько флажков, сколько имеется наборов данных (т. Е. n ). Каждый флажок позволит показать / скрыть соответствующий набор данных на графике.

Для простоты я буду предполагать, что каждый набор данных является простой строкой.


manipulate отлично работает, когда известны элементы управления. Здесь для одного элемента управления:

manipulate(plot(0,0,main=b), b=checkbox(TRUE, 'bool'))

enter image description here

Однако в моем случае мне нужно переменное количество элементов управления. Я могу создать список элементов управления следующим образом:

dataList = c('a', 'b', 'c')
ctrls = list()
for(data in dataList) {
  ctrls[[data]] = checkbox(TRUE, data)
}

manipulate(plot(0,0), ctrls)

enter image description here

Теперь давайте рассмотрим минимальный вариант использования: функция, которая создаст Участок. Его заголовок будет объединением всех имен наборов данных, имеющих значение TRUE.

Моя первоначальная идея состояла в том, чтобы передать список элементов управления функции, чтобы я мог получить доступ к каждому элементу управления там.

foo <- function(dataList, ctrls) {
  print(dataList)
  title = ''
  for(data in dataList) {
    if (ctrls[[data]]) {                 # this fails
      title=cat(title, data)
    }
  }
  plot(0,0,main=title)
}

manipulate(foo(dataList, ctrls), ctrls)

Вышеприведенные ошибки не выполняются, поскольку ctrls[[data]] не является значением элемента управления.

Есть ли способ получить доступ к текущему значению элемента управления, если ему присвоено значение manipulate внутри список

1 Ответ

1 голос
/ 19 апреля 2020

После некоторого возмущения я обнаружил, что могу использовать функцию get для извлечения значений переменных из области видимости перед вызовом foo.

  1. Во-первых, я готовлю список элементов управления

    series = list('a', 'b', 'c')
    controls = list()
    for(data in series) {
      controls[[data]] = checkbox(TRUE, data)
    }
    
  2. Затем у нас есть функция обратного вызова, которая принимает список в качестве аргумента

    foo <- function(data, bools) {
      t=""
      for(i in seq_along(data)) {
        if(bools[[i]]) t = c(t, data[[i]])
      }
      plot(0,0,main=t)
    }
    
  3. Наконец есть звонок на manipulate. Обратите внимание, что я сопоставляю список названий серий с соответствующими состояниями соответствующих флажков (TRUE или FALSE).

    manipulate(
      foo(lapply(series, function(e) get(e))), 
      controls
    )
    

enter image description here

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