对于将呈现传单地图的闪亮应用程序,我使用'ggmap'包中的"Crime"数据集.我试图实现两个输入.一个是'进攻',另一个是'月'变量.这些变量可以从闪亮的下拉菜单中获得.目标是通过攻击类型和月份的组合来过滤和显示.防爆.例如4月的抢劫......
当被解雇时,我得到了Point data not found;错误.
这是一个提取数据的代码构造.
fData <- reactive({
data <- hustonCrime
if (input$offenseFilter != "All"){
data <- subset(hustonCrime, offense %in% input$offenseFilter)
}
if (input$monthFilter != "All"){
data <- subset(hustonCrime, month %in% input$monthFilter)
}
})
Run Code Online (Sandbox Code Playgroud)
要修复错误的过滤情况,您必须将代码切换为以下内容:
fData <- reactive({
data <- hustonCrime
if (input$offenseFilter != "All") {
data <- subset(data, offense %in% input$offenseFilter)
}
if (input$monthFilter != "All") {
data <- subset(data, month %in% input$monthFilter)
}
return(data)
})
Run Code Online (Sandbox Code Playgroud)
您的代码中的问题是您将重置data为其中的子集hustonCrime,而实际上,您希望保持子集化data.
如评论中所示,此代码累积过滤数据而不是原始问题中的代码.为了看到这一点,让我们来看看每个代码发生的事情,因为在Shiny应用程序中输入已更改.
首先,我们不要改变任何东西.两个输入都设置为"全部".
原始代码:
Shiny加载应用程序并fData创建,因为它是一个反应元素.闪亮的步骤进入反应功能并设置data等于hustonCrime.然后检查input$offenseFilter并input$monthFilter看到它们都等于"全部"并且它没有变化data.然后它返回data.
新代码:
与原始代码完全相同.
接下来,让我们看看当用户改变时会发生什么input$offenseFilter.
原始代码:
Shiny识别input$offenseFilter已发生变化并找到依赖于该变量的所有反应元素.它找到fData并进入代码.它设置为data等于hustonCrime然后检查是否input$offenseFilter等于"全部".它发现它不和其子集hustonCrime,使得offense在中元素的向量的值input$offenseFilter.它接下来检查是否input$monthFilter等于"全部"并发现它是,因此它不做任何更改.函数返回data,设置为过滤hustonCrime.
新代码:
Shiny认识到input$offenseFilter已发生变化并找到依赖于该变量的所有反应元素.它找到fData并进入代码.它设置为data等于hustonCrime然后检查是否input$offenseFilter等于"全部".它发现它不是,它是子集data,不是 hustonCrime,它在下一步中很重要,并继续前进.它承认input$monthFilter等于"全部"和返回data,这是原始的子集data.
现在,让我们看一下用户还选择月份过滤器的最后一步.
原始代码:反应函数的
闪亮步骤fData和设置data等于hustonCrime.然后,它会覆盖data用的子集hustonCrime,其中offense在input$offenseFilter.接下来,它看到它input$monthFilter不等于"全部",并且它再次覆盖 data了元素向量中的hustonCrimewhere 的新子集.由于刚刚被仅仅依赖的子集覆盖,因此它不再包含过滤器.monthinput$monthFilterdatahustonCrimemonthoffense
新代码:
进入函数的闪亮步骤,设置data等于hustonCrime然后data用其自身的子集覆盖,而不是hustonCrime数据集.接下来,它发现它input$monthFilter不等于"全部"并再次data用其自身的子集覆盖.这很重要,因为在此步骤之前,data过滤offense时hustonCrime没有过滤.由于data已经过滤offense,month现在过滤它给我们在过滤中寻找的交互.
最后,原始代码会使用整个数据集的子集覆盖数据,而实际上我们希望将工作数据集的子集保留为包括已选择的所有过滤器.