对于将呈现传单地图的闪亮应用程序,我使用'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) } })
brittenb.. 5
要修复错误的过滤情况,您必须将代码切换为以下内容:
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) })
您的代码中的问题是您将重置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
了元素向量中的hustonCrime
where 的新子集.由于刚刚被仅仅依赖的子集覆盖,因此它不再包含过滤器.month
input$monthFilter
data
hustonCrime
month
offense
新代码:
进入函数的闪亮步骤,设置data
等于hustonCrime
然后data
用其自身的子集覆盖,而不是hustonCrime
数据集.接下来,它发现它input$monthFilter
不等于"全部"并再次data
用其自身的子集覆盖.这很重要,因为在此步骤之前,data
过滤offense
时hustonCrime
没有过滤.由于data
已经过滤offense
,month
现在过滤它给我们在过滤中寻找的交互.
最后,原始代码会使用整个数据集的子集覆盖数据,而实际上我们希望将工作数据集的子集保留为包括已选择的所有过滤器.
要修复错误的过滤情况,您必须将代码切换为以下内容:
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) })
您的代码中的问题是您将重置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
了元素向量中的hustonCrime
where 的新子集.由于刚刚被仅仅依赖的子集覆盖,因此它不再包含过滤器.month
input$monthFilter
data
hustonCrime
month
offense
新代码:
进入函数的闪亮步骤,设置data
等于hustonCrime
然后data
用其自身的子集覆盖,而不是hustonCrime
数据集.接下来,它发现它input$monthFilter
不等于"全部"并再次data
用其自身的子集覆盖.这很重要,因为在此步骤之前,data
过滤offense
时hustonCrime
没有过滤.由于data
已经过滤offense
,month
现在过滤它给我们在过滤中寻找的交互.
最后,原始代码会使用整个数据集的子集覆盖数据,而实际上我们希望将工作数据集的子集保留为包括已选择的所有过滤器.