动态选择输入不使用加载的数据

时间:2015-12-27 19:59:42

标签: r shiny

使用R shiny,我正在开发一个简单的应用程序,允许用户从Rdata文件中输入数据。我希望应用程序加载数据,在选择输入字段中显示数字变量的名称,并在用户选择其中一个变量后进行一些分析。但我无法让它发挥作用。在提供的代码中,我获得了两个输出:summary,工作正常,以及所选变量的 MEAN,我无法工作

server.R

library(shiny)
library(shinydashboard)
library(data.table)
library(DT)

shinyServer(function(input, output) {


####   DATA LOAD
df <- reactive({
 df <- input$datafile
 if (is.null(df)) {
  # User has not uploaded a file yet
  return(NULL)
 }
 objectsLoaded <- load(input$datafile$name) 
 # the above returns a char vector with names of objects loaded
 df <- eval(parse(text=objectsLoaded[1])) 
 # the above finds the first object and returns it
 df<-data.table(df)

})


####   SELECTS

num <- reactive({  
 num <- sapply(df(),is.numeric)
 num <- names(num)
})

output$var_num <- renderUI({
 vector.num <- as.vector(num())
 selectInput("var_num", "Select Variables :", as.list(vector.num),  multiple = FALSE)
 }) 



####   OUTPUTS 
### SUMMARY 
output$summary_num <-renderDataTable({
  x<-t(sapply(df(), summary))
  x<-as.data.frame(x)
  x<-setDT(x, keep.rownames = TRUE)[]
  colnames(x) <- c("Variable","Mínimo","1er Quartil", "Mediana", "Media", "3er Quartil","Máximo")
  datatable(x)

 })

### MEAN OF SELECTED VAR  
output$test <-renderPrint ({
  if(is.null(df()))
  return()
  dat<- df()
  dat <- dat[,num(), drop = FALSE]
  mean(dat[,input$var_num])
  })  
})

UI.R

dashboardPage(
  dashboardHeader(title = "TITLE", titleWidth = 500),
  dashboardSidebar(disable = TRUE), #---> fin SIDEBAR
  dashboardBody(
    fluidRow(
      box(width=12,  status = "primary",
        tabsetPanel(
          tabPanel("Test",
                   fileInput("datafile", label = h3("File input")),
                   uiOutput("var_num"),
                   br(),hr(),br(),

                   fluidRow(column(width=4, uiOutput("var_caracter"),textOutput("test"))),
                   br(),hr(),br(),

                   fluidRow(column(width=8, "Variables Numericas", dataTableOutput("summary_num")))
                   )

            ) # fin tabsetPanel
          ) # fin box
      )# fin fluidRow
    )# fin dashboardBody
 )# fin dashboardPage

当我运行应用程序时,一切都很顺利(选择输入,摘要等),除了计算和打印所选变量的MEAN。我想由于某种原因,子集化的数据帧是空的,但我不知道为什么...... 任何帮助都会很棒!提前谢谢。

1 个答案:

答案 0 :(得分:1)

我开始工作了。 解决方案是定义我使用的数据集as.data.frame

### MEAN OF SELECTED VAR  
  output$test <-renderPrint ({
    if(is.null(df()))
      return()
    dat<- as.data.frame(df()) ## THIS IS THE CORRECTION
    dat <- dat[,num(), drop = FALSE]
    mean(dat[,input$var_num])
 })  

我真的不明白为什么......反应文件df()被定义为data.table和dat继承它,但由于某种原因,它必须是一个明确的定义为数据帧。