对于将呈现传单地图的闪亮应用程序,我使用'ggmap'包中的“Crime”数据集。我试图实现两个输入。一个是'进攻',另一个是'月'变量。这些变量可以从闪亮的下拉菜单中获得。目标是通过攻击类型和月份的组合来过滤和显示。防爆。例如,4月的抢劫......
如果被解雇,我会收到 <RadioGroup
android:id="@+id/optionGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/radio1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="RadioButton"
android:textColor="@color/optionText"
android:textSize="@dimen/text_exam"
android:gravity="top" />
<RadioButton
android:id="@+id/radio2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RadioButton"
android:textColor="@color/optionText"
android:textSize="@dimen/text_exam"
android:gravity="top" />
<RadioButton
android:id="@+id/radio3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RadioButton"
android:textColor="@color/optionText"
android:textSize="@dimen/text_exam"
android:gravity="top" />
<RadioButton
android:id="@+id/radio4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RadioButton"
android:textColor="@color/optionText"
android:textSize="@dimen/text_exam"
android:gravity="top" />
</RadioGroup>
错误。
这是一个提取数据的代码构造。
Point data not found;
答案 0 :(得分: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
, NOT hustonCrime
,这在下一步中很重要,并继续前进。它承认input$monthFilter
等于“全部”并返回data
,这是原始data
的子集。
现在,让我们看看用户还选择月份过滤器的最后一步。
原始代码:
闪烁进入fData
反应函数并将data
设置为hustonCrime
。然后,它会使用data
的子集覆盖hustonCrime
,其中offense
位于input$offenseFilter
。接下来,它看到input$monthFilter
不等于“全部”,并且它再次覆盖 data
,其中hustonCrime
的新子集位于month
input$monthFilter
中元素的向量。由于data
刚被hustonCrime
的子集覆盖,仅依赖于month
,因此它不再包含offense
过滤器。
新代码:
在函数中有光泽的步骤,将data
设置为hustonCrime
,然后用自身的子集覆盖data
,而不是hustonCrime
数据集。接下来,它发现input$monthFilter
不等于“全部”,并再次使用其自身的子集覆盖data
。这很重要,因为在此步骤之前,data
已被offense
过滤而hustonCrime
未过滤data
。由于offense
已经被month
过滤了,因此按class MyAudioPlayer: NSObject, AVAudioPlayerDelegate {
private static let sharedPlayer: MyAudioPlayer = {
return MyAudioPlayer()
}()
private var container = [String : AVAudioPlayer]()
static func playFile(name: String, type: String) {
var player: AVAudioPlayer?
let key = name+type
for (file, thePlayer) in sharedPlayer.container {
if file == key {
player = thePlayer
break
}
}
if player == nil, let resource = NSBundle.mainBundle().pathForResource(name, ofType:type) {
do {
player = try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: resource), fileTypeHint: AVFileTypeMPEGLayer3)
} catch {
// error
}
}
if let thePlayer = player {
if thePlayer.playing {
// already playing
} else {
thePlayer.delegate = sharedPlayer
sharedPlayer.container[key] = thePlayer
thePlayer.play()
}
}
}
}
过滤它现在可以为我们提供我们在过滤中寻找的互动。
最后,原始代码会使用整个数据集的子集覆盖数据,实际上我们希望保持对工作数据集的子集,以包括已选择的所有过滤器。