r - 如何在 Shiny 的情况下创建 On load 事件或默认事件?

标签 r shiny shinydashboard shinyjs

我是 Shiny 和 stackoverflow 的新手,正在寻找有关我目前遇到的问题的帮助。
我正在尝试构建一个 Shiny 的应用程序,它从用户那里收集一些输入,并根据单击按钮的输入创建可视化。目前,这工作正常,但一个主要问题是,当应用程序第一次加载时,它应该根据默认输入准备可视化。
我正在粘贴一个示例代码,它可以解释我面临的问题:
用户界面

  #loading shiny
  library(shiny)
  
  ui<-shinyUI(fluidPage(
    titlePanel("Iris Dataset"),
    sidebarLayout(
      sidebarPanel(
        radioButtons("x", "Select X-axis:",
                     list("Sepal.Length"='a', "Sepal.Width"='b', "Petal.Length"='c', "Petal.Width"='d')),
        radioButtons("y", "Select Y-axis:",
                     list("Sepal.Length"='e', "Sepal.Width"='f', "Petal.Length"='g', "Petal.Width"='h')),
        actionButton("action","Submit")
      ),
      mainPanel(
        plotOutput("distPlot")
      )
    )
  ))
  
  #SERVER.R
  library(shiny)
  
  #loading shiny
  server<-shinyServer(function(input, output) {
    
    observeEvent(input$action,{
    output$distPlot <- renderPlot({if(input$x=='a'){i<-1}
      
      if(input$x=='b'){i<-2}
      
      if(input$x=='c'){i<-3}
      
      if(input$x=='d'){i<-4}
      
      if(input$y=='e'){j<-1}
      
      if(input$y=='f'){j<-2}
      
      if(input$y=='g'){j<-3}
      
      if(input$y=='h'){j<-4}
      
      s    <- iris[, i]
      k    <- iris[, j]
      plot(s,k)
    })
  })
  })
  
  
  shinyApp(ui<-ui, server<-server)
现在,如果您运行此应用程序,您会看到在加载后的第一个屏幕上选择了输入(根据需要),但仅在单击“提交”按钮后才会显示可视化,这是因为观察者事件。 在实际的应用程序中,在单击按钮时捕获输入后正在执行计算。因此,计算仅在单击 actionButton 时触发
有没有办法,我们仍然可以保留“提交”按钮及其观察事件,但会在开始时自动触发可视化或观察事件中执行的操作,即当应用程序第一次加载时。

最佳答案

使用 renderPlot或其他渲染函数 observeEvent被认为是不好的做法。您正在寻找的是一个代表绘图参数的 react 对象。然后你可以在你的 renderPlot 中访问这个 react 对象。语境。这是一个例子

library(shiny)

ui <- shinyUI(fluidPage(
  titlePanel("Iris Dataset"),
  sidebarLayout(
    sidebarPanel(
      radioButtons("x", "Select X-axis:",
                   list("Sepal.Length" = 'a', "Sepal.Width" = 'b',
                        "Petal.Length" = 'c', "Petal.Width" = 'd')),
      radioButtons("y", "Select Y-axis:",
                   list("Sepal.Length" = 'e', "Sepal.Width" = 'f', 
                        "Petal.Length" = 'g', "Petal.Width" = 'h')),
      actionButton("action", "Submit")
    ),
    mainPanel(
      plotOutput("distPlot")
    )
  )
))

server <- shinyServer(function(input, output) {

  user_choice <- eventReactive(input$action,{
    if (input$x == 'a'){i <- 1}    
    if (input$x == 'b'){i <- 2}    
    if (input$x == 'c'){i <- 3}    
    if (input$x == 'd'){i <- 4}    
    if (input$y == 'e'){j <- 1}    
    if (input$y == 'f'){j <- 2}    
    if (input$y == 'g'){j <- 3}    
    if (input$y == 'h'){j <- 4}

    return(c(i, j))

    ## use ignoreNULL to fire the event at startup
  }, ignoreNULL = FALSE)

  output$distPlot <- renderPlot({
    uc <- user_choice()
    plot(iris[, uc[1]], iris[, uc[2]])
  })
})


shinyApp(ui = ui, server = server)

对象 user_choice每当用户单击按钮或应用程序启动时都会更新。

还有一个ignoreNULL observeEvent 中的参数但出于某种原因,这不会产生相同的结果。

关于r - 如何在 Shiny 的情况下创建 On load 事件或默认事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48894343/

相关文章:

R 安装包加载命名空间

r - R 中不可用的包小插图

r - 用等于0的一行替换变量的所有NA值

r - R Shiny应用程序中的执行延迟

r - 错误 : argument "x" is missing, 没有默认值

r - 通过重叠时间间隔查找变量的最大值

r - 交互式创建一个弹出对话框

在 Shiny 的应用程序中调整 Flex 仪表板仪表的大小

javascript - 将多个项目粘贴到 selectizeInput [ Shiny ]

r - Shiny 仪表板加 : Opening a closed boxPlus