Используйте реактивную переменную для построения гистограммы с использованием plotly - PullRequest
0 голосов
/ 14 июня 2019

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

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

df_data <- reactiveValues(data= NULL)

observeEvent(input$filename,{
  df_data$data <- data.frame(read.csv(input$filename$datapath))
  updateSelectInput(session,"field_mapping",choices = colnames(df_data$data))
  updateCheckboxInput(session,"outlier_removal",value = TRUE)
})

observeEvent(input$outlier_removal,{
if(input$outlier_removal)
{ cash_diff <- removeOutliers(createCashDiff(as.vector(df_data$data[,input$field_mapping]),input$percent_change)) }
else { cash_diff <- removeOutliers(createCashDiff(as.vector(df_data$data[,input$field_mapping]),input$percent_change)) }
output$Histogram <- renderPlotly({ plotDiff(cash_diff) })
})

1 Ответ

0 голосов
/ 14 июня 2019

Я не думаю, что вы должны пытаться строить изнутри блока observe. Более того, все, что находится внутри выражения (второй аргумент) observeEvent, выполняется явно без побочного эффекта реактивности, поэтому оно, так сказать, изолируется / маскируется.

Попробуйте это:

df_data <- reactiveValues(data= NULL)

observeEvent(input$filename,{
  df_data$data <- data.frame(read.csv(input$filename$datapath))
  updateSelectInput(session,"field_mapping",choices = colnames(df_data$data))
  updateCheckboxInput(session,"outlier_removal",value = TRUE)
})

df_data_filtered <- reactive({
  x <- createCashDiff(as.vector(df_data$data[,input$field_mapping]),input$percent_change)
  if (input$outlier_removal) x <- removeOutliers(x)
  x
})

output$Histogram <- renderPlotly({ plotDiff(df_data_filtered()) })

Примечание: вы выполняете точно один и тот же вызов функции с обеих сторон вашего условия if (input$outlier_removal). Означает ли это, что ваши createCashDiff или removeOutliers функции сами получают значение input$outlier_removal? Я полагаю, что это будет плохой ход по двум причинам:

  1. Подобные функции должны быть независимы от использования внутри или снаружи блеска, чтобы вы могли разрабатывать и тестировать их в среде консоли / тестирования (не блестящей). Внедрение зависимости от «реактивности» (даже просто input$) внутри функций ограничивает потенциал функций; и

  2. В общем, хорошая практика написания функций включает в себя обеспечение того, чтобы они никогда не пытались получить доступ к переменным или объектам, которые либо (а) явно не переданы им, либо (б) не определены внутри функции (напрямую или через другую функцию). вызов). Когда у вас есть доступ к переменным функции за пределами ее непосредственного охвата, тестирование и воспроизводимость становятся более сложными и значительно труднее устранять неполадки , когда они плохо себя ведут.

...