R Shiny - 输出汇总统计

时间:2014-07-11 15:54:37

标签: r shiny

我刚开始与R和R Shiny合作。我一直在玩一些教程并构建了一个非常简单的数据探索应用程序 - 你选择了两个变量,它给你一个盒子图。

我添加了Rmarkdown功能,因此用户可以下载其结果的PDF,但希望包含一些摘要统计信息。示例 - 他们选择年龄和性别作为变量,PDF打印年龄,性别以及生成的箱线图的摘要。

我无法将摘要打印出来。我尝试了几种方法 - 如果我只是汇总(输入$ variable)它只是给出了空白的细节。我添加了代码,通过server.r存储输入$ variable选项,并尝试了它的摘要,但无法再找到该对象。我一直在谷歌搜索大约两天的答案,但我放弃了!如果有人能帮助我,这将是非常有益的,我想我只是不熟悉R来弄清楚我哪里出错了。

对于我对R的初学者知识深表歉意,我确信这是其中一个不应该引起问题的事情。

相关代码的一些摘录 - 另外,请注意,我的一些代码试图让它工作我知道是错误的方法去做它只是我尝试了很多不同的方式我想我会粘贴最后一次尝试以显示某些内容。

ui.R

#input
sidebarPanel
(
selectInput("dataset","Data:", 
            list(age = "ageData")
),
uiOutput("variable"),   # depends on dataset ( set by output$variable in  server.R)
uiOutput("group"),          # depends on dataset    ( set by output$group in  server.R)
selectInput("plot.type","Plot Type:", 
            list(Boxplot = "Boxplot", Histogram = "Histogram", Density = "Density", Bar        = "Bar")
),
checkboxInput("show.points", "Show points", TRUE),
checkboxInput("outliers", "Show outliers", TRUE),
br(),

helpText("Click download to output your plot and variable details to a document."),
radioButtons('format', 'Document format', c('PDF', 'HTML', 'Word'),
             inline = TRUE),
downloadButton('downloadReport'),
br(),
br(),
img(src = "logo.jpg")
  ),


   # checkboxInput("outliers", "Show outliers", FALSE)
  #),   

  # output              
  mainPanel(
    h3(textOutput("caption")),
    #h3(htmlOutput("caption")),
    uiOutput("plot") # depends on input 
  )
))

server.R

# shiny server side code for each call
shinyServer(function(input, output, session){
  #update variable and group based on dataset
  output$variable <- renderUI({ 
    obj<-switch(input$dataset,
                "ageData" = ageData)     
    var.opts<-namel(colnames(obj))
    selectInput("variable","y-axis:", var.opts) # uddate UI                  
  }) 

  output$group <- renderUI({ 
    obj<-switch(input$dataset,
                "ageData" = ageData)     
    var.opts<-namel(colnames(obj))
    selectInput("group","x-axis:", var.opts) # uddate UI                 
  }) 

  output$caption<-renderText({
    switch(input$plot.type,
           "Boxplot"    =   "Boxplot",
           "Histogram" =    "Histogram",
           "Density"    =   "Density plot",
           "Bar"        =   "Bar graph")
  })

  regFormula <- reactive({
    as.formula(paste(input$group, data=ageData))
  })

  output$regPrint <- renderPrint({
  summary(regFormula(), data = ageData)
  })

  output$plot <- renderUI({
    plotOutput("p")
  })

  #plotting function using ggplot2
  output$p <- renderPlot({

plot.obj<<-list() # not sure why input$X can not be used directly?
plot.obj$data<<-get(input$dataset) 
plot.obj$variable<<-with(plot.obj$data,get(input$variable)) 
plot.obj$group<<-with(plot.obj$data,get(input$group)) 

#dynamic plotting options
if(input$outliers==FALSE) {
plot.type<-switch(input$plot.type,
                  "Boxplot"     =   geom_boxplot(outlier.size=0),
                  "Histogram" = geom_histogram(alpha=0.5,position="identity"),
                  "Density"     =   geom_density(alpha=.75),
                  "Bar"         =   geom_bar(position="dodge")
)
}
else 
  {
    plot.type<-switch(input$plot.type,
                      "Boxplot"   =     geom_boxplot(),

                      "Histogram" = geom_histogram(alpha=0.5,position="identity"),
                      "Density"     =   geom_density(alpha=.75),
                      "Bar"         =   geom_bar(position="dodge")
    )
  }
require(ggplot2)
#plotting theme
    .theme<- theme(
      axis.line = element_line(colour = 'gray', size = .75), 
  panel.background = element_blank(),  
  plot.background = element_blank()
)    
if(input$plot.type=="Boxplot")  {       #control for 1D or 2D graphs 
  p<-ggplot(plot.obj$data, 
            aes(
              x         = plot.obj$group, 
              y         = plot.obj$variable,
             fill   = as.factor(plot.obj$group))

  ) + plot.type

  if(input$show.points==TRUE)
  { 
    p<-p+ geom_point(color='black',alpha=0.5, position = 'jitter')
  }

} else {

  p<-ggplot(plot.obj$data, 
            aes(
              x         = plot.obj$variable,
              fill  = as.factor(plot.obj$group),
              group     = as.factor(plot.obj$group),
              color     = as.factor(plot.obj$group)
            )
  ) + plot.type
}

p<-p+labs(
  fill  = input$group,
  x         = "",
  y         = input$variable
)  +
  .theme
print(p)


   })   

  output$downloadReport <- downloadHandler(
    filename = function() {
      paste('my-report', sep = '.', switch(
        input$format, PDF = 'pdf', HTML = 'html', Word = 'docx'
      ))
    },

    content = function(file) {
      src <- normalizePath('report.Rmd')

  # temporarily switch to the temp dir, in case you do not have write
  # permission to the current working directory
  file.copy(src, 'report.Rmd')

  library(rmarkdown)
  out <- render('report.Rmd', switch(
    input$format,
    PDF = pdf_document(), HTML = html_document(), Word = word_document()
  ))
  file.rename(out, file)
}
  )

})

**report.Rmd**

Here are some summary statistics:

```{r summary}


print(regFormula())

summary(regFormula(), data=ageData)




```

1 个答案:

答案 0 :(得分:2)

内置了摘要语句的

renderPrint({})是服务器端问题的答案,以及ui端的verbatimTextOutput()!有关示例,请参阅此链接中的步骤4:

这是你的应用程序的代码,让我们看看我们如何创建它的一步一步执行。我们已经定义了标题面板。现在我们将在侧边栏面板中定义一些小部件。

ui.R

shinyUI(fluidPage(
    titlePanel("My first Shiny app!"),
  sidebarLayout(
    sidebarPanel(
    selectInput("var",label="Choose a variable",choice=c("Sepal.Length"=1,
                                                                  "Sepal.Width"=2,
                                                                  "Petal.Length"=3,
                                                                  "Petal.Width"=4), selectize=FALSE)),
    mainPanel(
      h2("Summary of the variable"),
      verbatimTextOutput("sum"),
      plotOutput("box")
      )
    ))
  )

server.R

library(shiny)
library(datasets)

shinyServer(function(input,output){

output$sum <- renderPrint({

  summary(iris[,as.numeric(input$var)])
  })

output$box <- renderPlot({

  x<-summary(iris[,as.numeric(input$var)])
  boxplot(x,col="sky blue",border="purple",main=names(iris[as.numeric(input$var)]))
})
}
)

这里我们使用的数据来自R中现有的数据集库。您可以通过调用库(数据集)函数来访问此数据集。我们在这里使用了虹膜数据集。您可以通过在R控制台中调用?iris函数来了解虹膜数据集。

http://sanaitics.com/UploadedFiles/html_files/8737Shiny_article.html

verbatimTextOutput(“regPrint”)将成功。