R ggvis Объединение нескольких ползунков в один вычисляемый слой кривой

Основываясь на этом моем вопросе: интерактивный ползунок R ggvis для вычисления значений y (например, для коррекции фона), я хотел бы использовать несколько ggvis ползунки, чтобы изменить одну коррекцию фона.

library("dplyr")
library("ggvis")
library("lubridate")
data <- data.frame(timestamp = Sys.time() - hours(10:1),
                   signal = rnorm(10),
                   temperature = rnorm(10),
                   secondParameter = rnorm(10))

# mySliderA works fine
mySliderA <- input_slider(0, 2, value = 0, step = 0.1, label = "T-correction", 
                         map = function(x)  data$signal - x * data$temperature)
# mySliderB wants to add a second parameter to the calculation based on mySliderA, this fails.
mySliderB <- input_slider(0, 2, value = 0, step = 0.1, label = "P2-correction", 
                          map = function(x2)  mySliderA - x2 * data$secondParameter )

data %>% 
  ggvis() %>%
  layer_paths(x = ~timestamp, y = ~signal,      stroke := "darkgreen") %>%
  layer_paths(x = ~timestamp, y = ~temperature, stroke := "red") %>%
  # layer_paths(... y = mySliderA, ...) # would work, but:
  layer_paths(x = ~timestamp, y = mySliderB,    stroke := "darkblue")
  # does not.

Как мне заставить работать второй ползунок? Возможно, мне нужно связать mySliderA-рассчитанные значения по-другому, но я не знаю, как это сделать.


person Wordsmyth    schedule 20.05.2015    source источник


Ответы (1)


Вы можете использовать функцию getValue из атрибута observable другого ползунка. Чтобы получить оба ползунка, нужно еще построить линию с mySliderA, но она, конечно, может быть и прозрачной.

# mySliderA 
mySliderA <- input_slider(0, 2, value = 0, step = 0.1, label = "T-correction", 
                          map = function(x)  data$signal - x * data$temperature)

# mySliderB using `attr(mySliderA, "observable")$getValue()`
mySliderB <- input_slider(0, 2, value = 0, step = 0.1, label = "P2-correction", 
                          map = function(x2)  attr(mySliderA, "observable")$getValue() -
                            x2 * data$secondParameter)
# plotting
data %>% 
  ggvis() %>%
  layer_paths(x = ~timestamp, y = ~signal,      stroke := "darkgreen") %>%
  layer_paths(x = ~timestamp, y = ~temperature, stroke := "red") %>%
  layer_paths(x = ~timestamp, y = mySliderA, stroke := "transparent")  %>% 
  layer_paths(x = ~timestamp, y = mySliderB, stroke := "darkblue")
person shadow    schedule 20.05.2015
comment
Ах, здорово! Тогда это очень похоже на фрагменты javascript, верно? Интересно... Еще раз спасибо, @shadow. - person Wordsmyth; 20.05.2015