如何运行从eventReactive内部获取数据并在表中绘图的函数?

时间:2016-03-10 19:40:35

标签: r function shiny reactive-programming

我很擅长发光并且遇到麻烦并且一直在寻找,所以希望有人可以帮助我。一旦用户选择了一个动作按钮(在UI上的actionButton),我希望服务器脚本调用一个函数(在服务器中是evenReactive)我写的(myfunction,见下文),它使用UI中的输入项并获取正确的参数我需要运行myfunction并生成一个X2数据矩阵,将其绘制成一个表(服务器中的renderTable,如下)。数据是n X 2矩阵。

我在下面有一些示例代码。它不是entre代码,所以你不会看到我在函数中输入的UI,或者与之关联的服务器部分。但是,这是我试图修复的部分。我希望没关系。我不需要renderText,但是当我把它拿出来时我得到一个错误。抱歉格式化。复制和粘贴改变了一点。

library(shiny)

ui <- shinyUI(fluidPage
     (column(4,actionButton("gobutton", "Run"),verbatimTextOutput("ntext1")), 
      column(4, DT::dataTableOutput("table",width = "75%"))))

library(shiny)

shinyServer(function(input, output, session) 


  ntext1 <- eventReactive(input$gobutton, {
            if (input$gobutton==1){ 
              data=myfunction(input$checkbox,input$dateRange)}
   })


  output$ntext1 <- renderText({ntext1()})

  output$table <- DT::renderDataTable(DT::datatable({
    data
  })
))

myfunction <-function(All,date1,date2,source_cd,tran_cd,airline_list,mag_level) {
 print(All); print(date1); print(date2); print(source_cd);print(tran_cd);print(airline_list);print(mag_level)

    setwd("C:/Users/TRomano/Documents/Projects/TrendAnalysis/Data")
    data = read.csv("Airlines.csv",header = TRUE)
    return(data)
  }

2 个答案:

答案 0 :(得分:4)

对于这类问题,我喜欢使用旨在以被动方式存储数据的reactiveValues()

这是一个简单的应用程序(单个应用程序,不分成服务器和用户界面),它展示了我认为你想要做的事情

library(shiny)
library(DT)

ui <- shinyUI(
    fluidPage(
        column(width = 4,
                     actionButton("gobutton", "Run")
        column(width = 4, 
                     DT::dataTableOutput("table",
                                         width = "75%"))))

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

    rv <- reactiveValues()
    rv$data <- NULL

    observe({    ## will 'observe' the button press

        if(input$gobutton){ 
            print("here")  ## for debugging
            rv$data <- myfunction()   ## store the data in the reactive value
            rv$data
            }
        })

    output$table <- DT::renderDataTable({
        ## The data has been stored in our rv, so can just return it here
        rv$data
    })
})

myfunction <- function(){
    data <- data.frame(id = c(1,2,3),
                       val = letters[1:3])
    return(data)
}

shinyApp(ui, server)

答案 1 :(得分:1)

库(有光泽)

库(shinydashboard)

ui&lt; - dashboardPage(

dashboardHeader(title =“公司名称”),

dashboardSidebar(sidebarMenu(

menuItem(“结果表”,tabName =“ResultsTable”,图标=图标

( “ResultsTable”)),

dashboardBody(

tabItems(

  tabItem(tabName tabItem(tabName = "ResultsTable",
          fluidPage(  
            headerPanel(
            fluidRow(
              column(4,
                     selectInput("sour",
                                 "Source Type:",
                                 c("All",
                                   unique(as.character(data_source_cd)))), offset=2
              ),
              column(4,
                     selectInput("tran",
                                 "Transaction Type:",
                                 c("All",
                                   unique(as.character(tran_cd)))))),
            # Create a new row for the table.
            fluidRow(column(8, DT::dataTableOutput("table",width = "75%"),offset = 2))))))

库(有光泽) shinyServer(函数(输入,输出,会话){        ntext1&lt; - eventReactive(输入$ gobutton,{

if (input$dateRange[2]<input$dateRange[1]){print("You selected the date range option;however, the end date entered occurs before the starting date")}else{
  output$ntext1 <- renderText({print("Analysis complete...")});
  observe({   
    if(input$gobutton){ 
      rv$data <- myfunction()          }
  })
  output$table <- DT::renderDataTable(DT::datatable({
    data <- rv$data
    if (input$sour != "All") {
      data <- data[data[,5] == input$sour,]
    }else{data}
    if (input$tran != "All") {
      data <-data[data[,6] == input$tran,]
    }else{data} 
  }))
}})

在仪表板的主页面上选择一个操作按钮(未显示)后,myfunction将使用主仪表板页面的输入进行分析。在另一个选项卡上,一旦分析完成,就会显示一个表格。有下拉菜单(输入$ tran,输入$ sour)将根据用户选择的内容减少表中的内容。如果输入中有任何错误,主仪表板页面上会出现文本警告,并且在选择正确的输入之前,不会创建带有表格的选项卡。

observe函数允许我运行我的函数并将函数的输出数据设置为一个变量,我以后可以用它来创建表(如图所示)。

这是我第一次发帖。任何问题随时都可以问。