r - 使用反应变量使用绘图绘制直方图



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

我不确定如何在这里准确使用反应性。如果我不使用反应性,那么我会收到一个错误,即我的数据集在 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)
})
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) })
})

我认为你不应该试图从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. 像这样的功能应该与在 Shiny 内部或外部使用无关,因此您可以在控制台/测试(非 shiny)环境中进行开发和测试。在函数中嵌入对"反应性"(即使只是input$)的依赖正在限制函数的潜力;和

  2. 一般来说,编写函数的良好实践包括确保它们永远不会尝试访问未 (a) 显式传递给它们的变量或对象,或 (b) 未在函数中定义(直接或通过另一个函数调用)。当您的函数访问其直接范围之外的变量时,测试和可重现性变得更加复杂,并且在它们行为异常更难进行故障排除。

最新更新