使用反应变量使用plotly绘制直方图

时间:2019-06-14 10:23:53

标签: r shiny reactive

我正在尝试制作一个应用程序,用户可以在其中浏览文件,然后从列名列表中选择任何特定的列,然后将绘制直方图。此外,我想给用户一个选项来删除离群值,这是一个checkboxinput。如果单击该复选框,则将删除异常值,并再次绘制直方图。简而言之,直方图会对用户在复选框中所做的选择做出反应。当在复选框上观察到observeEvent时,我无法绘制图形。我认为在将其创建为反应式时,没有正确引用我的数据。

我不确定在这里如何准确地使用反应性。如果我不使用反应性,则会收到一个错误消息,表明我的数据集在observeEvent函数下不可用(可能是local函数)

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 :(得分:0)

我认为您不应该尝试从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)条件的两侧都执行完全相同的函数调用。这是否意味着您的createCashDiffremoveOutliers函数本身就获得了input$outlier_removal值?我认为这是一个不好的举动,有两个原因:

  1. 类似的功能应该与在闪亮内部或外部使用无关,因此您可以在控制台/测试(非发光)环境中进行开发和测试。在函数内部嵌入对“反应性”(甚至只是input$)的依赖正在限制函数的潜力;和

  2. 通常,编写函数的良好实践包括确保函数绝不尝试访问未(a)显式传递给它们或(b)在函数内定义的变量或对象(直接或通过另一个函数)呼叫)。如果您有一个函数无法访问其直接范围的变量,则测试和重现性将变得更加复杂,并且在 行为异常时很难进行故障排除。