以下是该方案:
我有一个名为stories
的数据框,由以下类型的名为abc()
的函数生成:
X1 X2 X3 X4 X5
1 a e i m q
2 b f j n r
3 c g k o s
4 d h l p t
现在我已经在ui.r中给出了5个动作按钮说(动作1,......,动作5)
现在,当用户选择操作1时,我想要像其他人一样显示stories[,1]
,例如操作5显示stories[,5]
为了达到这个目的,我写了一个If
语句,遗憾的是,这只会根据我上次if
条件中的最后一个来产生值
以下是server.R代码:
shinyServer(
function(input,output,session){
abc()
terms<-reactive({
if(input$analyse5){
isolate({
withProgress({
setProgress(message = "Analyzing")
stories[,5]
})
})}
if(input$analyse4){
isolate({
withProgress({
setProgress(message = "Analyzing")
stories[,4]
})
})}
if(input$analyse3){
isolate({
withProgress({
setProgress(message = "Analyzing")
stories[,3]
})
})}
if(input$analyse2){
isolate({
withProgress({
setProgress(message = "Analyzing")
stories[,2]
})
})}
if(input$analyse1){
isolate({
withProgress({
setProgress(message = "Analyzing")
stories[,1]
})
})}
})
output$text1<-renderUI({
HTML(paste(h2(terms()[1]),terms()[2],terms()[3],terms()[4],sep='<br/><br/>'))
})
}
)
首先,当我按下第一个动作按钮时,它会触发[a,b,c,d]
如果先按下任何其他动作按钮,则不会产生任何效果,类似地,在按下第一个动作按钮之后,然后是其他动作按钮,它不会显示相应的列故事,即说动作2不给stories[,2]=[e,f,g,h]
而不是理想地保持[a,b,c,d]
,这意味着按钮没有响应
以下是ui.r供您参考:
shinyUI(
fluidPage((
titlePanel('Some Headline')),
sidebarLayout(
sidebarPanel(
actionButton("analyse1","Action 1"),
actionButton("analyse2","Action 2"),
actionButton("analyse3","Action 3"),
actionButton("analyse4","Action 4"),
actionButton("analyse5","Action 5")
),
mainPanel(
h4(htmlOutput("text1"))
))))
修改:使用observeEvent
修改后的代码部分:
terms<-reactive({
observeEvent((input$analyse5),{
isolate({
withProgress({
setProgress(message = "Loading 5th Article...")
stories[,5]
})
})})
observeEvent((input$analyse4),{
isolate({
withProgress({
setProgress(message = "Loading 4th Article...")
stories[,4]
})
})})
这改善了这种情况:早些时候我可以看到所有动作按钮同时执行(每个场景触发的进度消息)现在我只看到按钮上的相应按钮进度消息,但我不能为了获得输出,它仍然是第一个输出。
请帮助解决一些代码示例。
更新:当我添加打印(故事[,5])或打印(故事[,4])时,它会在控制台上打印,以便单击相应的按钮,但不会在闪亮的应用程序上打印。
答案 0 :(得分:2)
这是一个完整的应用程序。我刚上了电脑,所以我不能早点提交。我提交它以防你仍然觉得有用。
library(shiny)
stories <- matrix(letters[1:20], byrow = FALSE, nrow = 4)
shinyApp(
ui =
shinyUI(
fluidPage(
titlePanel('Some Headline'),
sidebarLayout(
sidebarPanel(
actionButton("analyse1","Action 1"),
actionButton("analyse2","Action 2"),
actionButton("analyse3","Action 3"),
actionButton("analyse4","Action 4"),
actionButton("analyse5","Action 5")
),
mainPanel(
h4(htmlOutput("text1"))
)
)
)
),
server =
shinyServer(function(input, output, session){
Terms <- reactiveValues(
Selection = 1
)
# using an observe block lets us listen for multiple events
# without having to rewrite the code five times
observe({
lapply(sprintf("analyse%s", 1:5),
function(x)
{
observeEvent(input[[x]],
Terms$Selection <- as.numeric(sub("analyse", "", x)))
})
})
output$text1<-renderUI({
HTML(paste(stories[, Terms$Selection],collapse='<br/><br/>'))
})
})
)
答案 1 :(得分:1)
来自@Benjamin的提示我能够解决这个问题:
以下是有效的更改(采样代码):
terms<-reactiveValues(dta = NULL)
observeEvent(input$analyse1,{
withProgress({
setProgress(message = "Loading 1st Article...")
terms$dta<-stories[,1]
})
})