在Shiny中,如何看待以后发生的动作?

时间:2015-07-03 04:43:44

标签: r shiny

在我的应用中,用户可以将其文件上传为输入数据(使用文件上传小部件)。如果他们没有数据,我会提供一些演示数据(用户可以通过点击actionButton来选择演示数据)。

如何制作变量=上传或演示,以较晚者为准?任何帮助表示赞赏。

server.R

library(shiny)

DemoData = data.frame('Col.1'=c('Demo','Demo'),
                      'Col.2'=c('Data','Data'))

shinyServer(function(input, output) {

    # option 1: use demo data
    getDemo = eventReactive(input$Demo,{
        DemoData
    })

    # option 2: user upload data
    getUpload = reactive({
        inFile = input$file
        if (is.null(inFile)) return(NULL)
        read.csv(inFile$datapath)
    })

    # need getData() to be option 1 or 2, whichever happened later
    # should respond to multiple times of changing between option 1 and 2
    getData = # ??? getDemo() or getUpload(), whichever is later

    # show the data
    output$InputData = renderDataTable({
        as.data.frame( getData() )
    })

})

ui.R

library(shiny)

shinyUI(fluidPage(

    titlePanel(h2("Hello Shiny")),

    sidebarLayout(

        sidebarPanel(

            fileInput('file', 
                      'Choose CSV File (two columns: Town and State)',
                      accept=c('text/csv',
                               'text/comma-separated-values,text/plain',
                               '.csv')
            ),

            actionButton('Demo', 'Use Demo Data')

        ),
        mainPanel(

            tabsetPanel(            
                tabPanel(title=h4('Data'),
                         column(5, tags$h3('Input Data'), dataTableOutput('InputData'))
                )


            )

        )
    )
))

UserData.R(可能让您更容易测试)

getwd()
setwe()

UserData = data.frame('Col.1'=c('User','User'),
                      'Col.2'=c('Data','Data'))

write.csv(UserData, file="UserData.csv", row.names=FALSE)

1 个答案:

答案 0 :(得分:1)

您可以使用观察者,一个观看演示按钮,另一个观看文件上传。两者都更新相同的反应数据,因此您可以看到最后发生的效果。

library(shiny)

DemoData <- data.frame('Col.1'=1:10,
    'Col.2'=rnorm(10))

shinyApp(
    shinyUI(fluidPage(
        titlePanel(h2("Hello Shiny")),
        sidebarLayout(
            sidebarPanel(
                fileInput('file', 
                          'Choose CSV File (two columns: Town and State)',
                          accept=c('text/csv',
                              'text/comma-separated-values,text/plain',
                              '.csv')
                          ),
                actionButton('Demo', 'Use Demo Data')
            ),
            mainPanel(
                tabsetPanel(            
                    tabPanel(title=h4('Data'),
                             column(5, tags$h3('Input Data'), tableOutput('InputData'))
                             )
                )
            )
        )
    )),
    shinyServer(function(input, output) {
        values <- reactiveValues()  # store values to be changed by observers
        values$data <- data.frame()

        ## Observer for uploaded file
        observe({
            inFile = input$file
            if (is.null(inFile)) return(NULL)
            values$data <- read.csv(inFile$datapath)
        })

        ## Observer for demo data button
        observe({
            if (input$Demo > 0)  # otherwise demo data shows on startup
                values$data <- DemoData
        })

        ## show the data
        output$InputData = renderTable({
            values$data
        })

    })
)