Ich habe eine App mit shinydashboard mit einer Gruppe von menuItems und menuSubItems sowie den entsprechenden tabItems erstellt, und es gibt ein conditionalPanel mit verschiedenen Eingabeparametern für jedes menuSubItems und einen actionButton für verschiedene Analyse und Plotten Aufgabe, jetzt funktioniert es, bevor der actionButton geklickt wird, das heißt, das conditionalPanel geändert, wenn zwischen menuSubItems, und es funktioniert auch gut zum ersten Mal actionButton ist angeklickt, das ist es zeigen eine Plot-HTML wie erwartet, aber Nach dem ersten Klick auf actionButton ändert sich das conditionalPanel nicht mehr wie zuvor beim Wechsel zwischen menuSubItems. Es scheint, dass die menuSubItems nicht aktualisiert werden können, wenn sie im UI mit der Maus angeklickt werden.shiny: verschiedene Aufgaben mit actionButton für jedes menuSubItems
genau, gibt es zwei Probleme:
vor dem runButton geklickt wird, die condtional parinbox korrekt geändert, wenn zwischen menusubItems Schalt und kann frei zwischen menusubItems swithching, und wenn das erste Mal die runButton ist geklickt, ein html mit einem Plot wird erzeugt und geladen wie erwartet, während es beim zweiten Aufruf beim switchen zu einem anderen menusubItem nicht funktioniert, die Eingabe $ sidebarmenu scheint nicht verändert zu sein?
Wie dekomprimiere ich die Parinbox, wenn auf ein menusubItem geklickt wird?
Dean Attali hat darauf freundlich, dass tabname von menusubItems nicht tatsächlich die ID des Untermenü-Elements in der App zu gehen, kann dies die Ursache ist, aber ich weiß nicht, wie es zu beheben, jede Hilfe wird geschätzt.
ein minimaler wiederholbar Code ist wie folgt:
library(shiny)
library(shinyjs)
library(shinydashboard)
library(knitr)
library(markdown)
library(rmarkdown)
library(ggplot2)
# parinbox #############################
jsboxcollapsecode <- "shinyjs.collapse = function(boxid) {
$('#' + boxid).closest('.box').find('[data-widget=collapse]').click();
}
"
selDateRange=dateRangeInput('dateRange',label='time:',start=Sys.Date()-7,end=Sys.Date()-1)
selcompyear=textInput("compyear",label="compyear:")
selmetsInput=selectInput(inputId="selmets",label="item:",choices=c("a","b","c"),selected=c("a","b"),multiple=TRUE)
condselcompyear =conditionalPanel("input.sidebarmenu=='subItemOne'||input.sidebarmenu=='subItemFour'",selcompyear)
condselmetsInput=conditionalPanel("input.sidebarmenu=='subItemThree'",selmetsInput)
runButton=actionButton(inputId="runButton",label=strong("run"),width=100)
opendirButton=actionButton(inputId="opendirButton",label=strong("opendir"),width=100)
fluidrunopenButton=fluidRow(column(4,offset=1,runButton),column(width=4,offset=1,opendirButton))
parInbox=box(id="parbox",title="Input parameter",status="primary",solidHeader=TRUE,collapsible=TRUE,collapsed=FALSE,width='auto',
selDateRange,condselcompyear,condselmetsInput,fluidrunopenButton)
absParInPanel=absolutePanel(id="parinbox",top=80,right=0,width=300,draggable=TRUE,parInbox)
# Sidebar #############################
sidebar <- dashboardSidebar(
tags$head(
tags$script(
HTML(
"
$(document).ready(function(){
// Bind classes to menu items, easiet to fill in manually
var ids = ['subItemOne','subItemTwo','subItemThree','subItemFour'];
for(i=0; i<ids.length; i++){
$('a[data-value='+ids[i]+']').addClass('my_subitem_class');
}
// Register click handeler
$('.my_subitem_class').on('click',function(){
// Unactive menuSubItems
$('.my_subitem_class').parent().removeClass('active');
})
})
"
)
)
),
width = 290,
sidebarMenu(id='sidebarmenu',
menuItem('Menu One', tabName = 'menuOne', icon = icon('line-chart'),
menuSubItem('Sub-Item One', tabName = 'subItemOne'),
menuSubItem('Sub-Item Two', tabName = 'subItemTwo')),
menuItem('Menu Two', tabName = 'menuTwo', icon = icon('users'),
menuSubItem('Sub-Item Three', tabName = 'subItemThree'),
menuSubItem('Sub-Item Four', tabName = 'subItemFour')))
# sidebarMenu(
# menuItem('Menu Two', tabName = 'menuTwo', icon = icon('users'),
# menuSubItem('Sub-Item Three', tabName = 'subItemThree'),
# menuSubItem('Sub-Item Four', tabName = 'subItemFour')))
)
# Body #############################
body <- dashboardBody(
useShinyjs(),
extendShinyjs(text=jsboxcollapsecode),
absParInPanel,
tabItems(
tabItem(tabName = 'subItemOne',
h2('Selected Sub-Item One'),uiOutput('subItemOne_html')),
tabItem(tabName = 'subItemTwo',
h2('Selected Sub-Item Two'),uiOutput('subItemTwo_html')),
tabItem(tabName = 'subItemThree',
h2('Selected Sub-Item Three'),uiOutput('subItemThree_html')),
tabItem(tabName = 'subItemFour',
h2('Selected Sub-Item Four'),uiOutput('subItemFour_html'))
)
)
# UI #############################
ui <- dashboardPage(
dashboardHeader(title = 'Test', titleWidth = 290),
sidebar,
body
)
# Server #############################
server <- function(input, output){
shinyOutput<- function(input=NULL){
sidebarmenu=input$sidebarmenu
start=as.Date(format(input$dateRange[1]))
end=as.Date(format(input$dateRange[2]))
time=seq(from=start,to=end+5,by="day")
gdata=data.frame(x=time,y=sample(1:100,length(time)))
if(sidebarmenu=='subItemOne'){
ggsave(ggplot(gdata,aes(x,y))+geom_line(),device="png",filename="tmp.png")
}else if(sidebarmenu=='subItemTwo'){
ggsave(ggplot(gdata,aes(x,y))+geom_col(),device="png",filename="tmp.png")
}else if(sidebarmenu=='subItemThree'){
ggsave(ggplot(gdata,aes(x,y))+geom_dotplot(),device="png",filename="tmp.png")
}else if(sidebarmenu=='subItemFour'){
ggsave(ggplot(gdata,aes(x,y))+geom_col(fill="red"),device="png",filename="tmp.png")
}
Rmdfile="tmp.Rmd"
writeLines(c("---","output: 'html_document'","---","```{r rcode,cache=FALSE}","knitr::include_graphics('tmp.png')","```"),Rmdfile)
shiny::includeHTML(rmarkdown::render(Rmdfile,clean=FALSE))
}
htmlvalues=reactive({
if(input$runButton==0) return()
isolate({
input$runButton
renderUI({shinyOutput(input)})
})
})
observeEvent(input$runButton,
{
js$collapse("parbox")
print(paste("the current selected submenu is",input$sidebarmenu,sep=":"))
output[[paste(input$sidebarmenu,"html",sep="_")]]=htmlvalues()
})
}
shinyApp(ui, server)
Vielen Dank für Ihre Hilfe. Ich denke, dass dies die Ursache des Problems sein könnte, ich werde es versuchen und Ihnen später sagen. – earclimate
Ich habe Ihre Vermutung überprüft, dass shiny :: includeHTML das Problem verursacht. Jetzt habe ich es mit 'htmltools :: HTML (markdown :: markdownToHTML (stricken (Rmdfile, quiet = TRUE)))}, und das menuSubItem kann frei geändert werden, nachdem der html geladen ist. aber das isolieren von RunButton scheint nicht funktioniert, der Plot-Code jedes Mal ausgeführt, wenn zwischen menuSubItems, und dann das bedingte Box-Element geändert wird, ist der feste Code wie folgt: – earclimate