基于Shiny滑块谓词对数据帧行值求和

时间:2014-03-10 15:32:48

标签: r shiny

我正在构建一个可以读入csv的Shiny应用程序,然后显示三个闪亮的dataTables,每个都显示在自己的tabPanel中;我在弄清楚如何处理第三张表时遇到了麻烦。

输入csv包含看起来像

的值
0, 1, 2, 3, 4, 5
0.01, 0.02, 0.11, 0.00, 0.1
.
.
.

我正在尝试显示一个显示值的表,以及一个附加列,表示该行的值小于滑块谓词。因此,如果我将滑块值设置为0.05,则所需的输出将为

tally, 0, 1, 2, 3, 4, 5
3, 0.01, 0.02, 0.11, 0.00, 0.1

UI.r 我尝试过(不包括不相关的代码)

sidebarPanel(
        sliderInput("p-value", "P-Value Adjustment:",
                    min = 0.01, max = 0.1, value = 0.05, step = 0.01),
        ),

mainPanel(
        #excluding two other panels that work correctly 
        tabsetPanel(
            tabPanel("Interactive-Data",
                     dataTableOutput("interactive.table"))
          )
     )

然后在 Server.r

shinyServer(function(input, output) {
   value.frame <- read.csv("path/to/file")

   sliderValues <- reactive({

    input.frame <- data.frame(
        Name = c("p-value"),
        Value = c(input$p-value))

    data.frame(cbind(input.frame, value.frame, stringsAsFactor=FALSE))

    })

#I'm lost here
output$interactive.table = renderDataTable({
    data.frame$tally <- rowSums(data.frame < p-value)
    data.frame

    })

我迷失了如何使用sliderInput的输入来动态重新计算interactive.table$tally列的值。 renderDataTable是否合适或是否有其他方法可以解决这个问题?

1 个答案:

答案 0 :(得分:3)

这似乎符合你的要求:

library(shiny)
shinyUI = pageWithSidebar(
  headerPanel("Title"),
  sidebarPanel(
    sliderInput("p.value", "P-Value Adjustment:",
                min = 0.01, max = 0.1, value = 0.05, step = 0.01)),
  mainPanel(
    tabsetPanel(
      tabPanel("Interactive-Data",
               dataTableOutput("interactive.table"))))
)
shinyServer = function(input,output){
  value.frame <- data.frame(matrix(round(runif(60,0,0.2),2),ncol=6))
  output$interactive.table <- renderDataTable({
    tally <- sapply(1:nrow(value.frame), function(i)
             rowSums(value.frame[i,2:ncol(value.frame)] < input$p.value,na.rm=T))
    df <- data.frame("p-value"=input$p.value,tally,value.frame)
    colnames(df)[3:8] <- c(as.character(0:5))
    df
  })}
runApp(list(
  ui = shinyUI,
  server = shinyServer
))

您的代码有几个有问题的方面。以下是一些:

  1. 引用p-value而不是input$p-value
  2. 使用p-value作为变量名称。 R认为input$p-valueinput$p减去value。您可以使用input$"p-value"解决此问题,但这会使代码几乎无法理解,因此我将p-value更改为p.value
  3. 您在data.frame的调用中引用了renderDataTable(...),就像它是变量一样。
  4. 创建或返回数据框的大多数函数都会将X添加到以数字开头的任何列名称,因此如果您坚持列名称的数字,则必须删除X's
  5. rowSums(...)无效。