闪亮的r:来自上传数据的numericInput

时间:2013-12-18 16:27:32

标签: r shiny

我刚刚开始使用闪亮,并得到以下基本问题。

1)上传的纵向数据包括具有治疗名称(例如A,B,C,D)的列,另一个包括相应的数字代码:例如1,2,4,6。根据上传的数据,编码可能会有所不同。每组治疗均由患者组成。

我想使用数字代码来选择要比较的治疗,排序为numericInput()。我需要根据提供的实际数据集中的编码更新列表。到目前为止,我用numericInput()做了它,假设编码在1到10之间(参见下面的代码)。

2)如果我想根据治疗名称(此处为A,B,C,D)进行选择,这些名称可能会在感兴趣的数据集中有所不同?

非常感谢。

shinyServer(function(input, output){
## Data reactives:
uploaded_Data <- reactive({
    inFile <- input $ data
    if(is.null(inFile)){return(NULL)}
    read.csv(file = inFile $ datapath,
             header=TRUE)

output $ raw_data <- renderTable({
    uploaded_Data()
})## for table


})

shinyUI(pageWithSidebar(
headerPanel(''),
sidebarPanel(
    fileInput('data', 'File to upload (.csv only):',
              accept=c('.csv')),
    tags $ hr(),
    h4('Select treatments:'),
    numericInput('T1','Treatment1 code:',1, min=1, max=10, step=1),
    numericInput('T2','Treatment2 code:',2, min=2, max=10, step=1)
    ),

## Option for tabsets:
mainPanel(
    tabsetPanel(
        tabPanel('Uploaded Data',
                 tableOutput('raw_data'))
        )
    )
))## overall

2 个答案:

答案 0 :(得分:2)

我认为你问的是如何基于上传的数据呈现动态UI输入?

如果是这种情况,请尝试将以下策略集成到您的应用中:

server.R:

#incomplete example
output$groupsToCompare <- renderUI({
  data <- uploaded_data()
  if(is.null(data)){return(NULL)} #This prevents an error if no data is loaded

  #In this example I will use selectInput, but you can also use checkboxInput or whatever really
  selectInput(inputId = 'selectedGroups', label = 'Select which groups to compare', choices = unique(data$treatments), multiple = TRUE)
})

#an example of how to use this input object
output$dataToShow <- renderTable ({
  data <- uploaded_data()
  if(is.null(data)){return(NULL)}

  #subset the data of interest; There are MANY ways to do this, I'm being verbose
  subsetData <- subset(data, input$selectedGroups)

  #alternatively, you could do data[input$selectedGroups]
  return(subsetData)
})

ui.R:

#incomplete example
uiOutput('selectedGroups')

这将动态生成可以选择作为输入的唯一因子列表。在您的情况下,它将生成“A”,“B”,“C”,“D”列表或数字因子列表。这些输入可用于对数据进行子集化,或为您梦寐以求的任何选择某些变量。我认为这可以回答你的两个问题,但如果不是,请告诉我,以便澄清。我之前没有使用selectInput测试multiple = TRUE,但我认为它会正常工作。一开始会觉得不寻常,因为你基本上在server.R中设置了一个UI元素,你习惯于在ui.R中构建UI,但是一旦你做了几次就会变成肉汁。

答案 1 :(得分:1)

我认为使用updateCheckboxGroupInput() - 函数可能会有所帮助

server.R

首先将shinyServer(function(input, output) ...更改为shinyServer(function(input, output, session) ...

而不是:

observe({
    x <- uploaded_Data()
    updateCheckboxGroupInput(session,
                             inputID = "selectedTreatments",
                             label = "Select which groups to compare",
                             choices = unique(x$treatments), # treatment columns
                             selected = unique(x$treatments),
                             inline = FALSE)
})

sidebarPanel()添加中的 ui.R

checkboxGroupInput(inputId = 'selectedTreatments',
                   label = 'no treatments to select yet',
                   choices = 1)

这会创建一个虚拟复选框,在上传文件后将替换为处理。 observe函数使“更新”进程不可见。数字输入可以类似地完成。

反馈会很好,因为我自己开始学习它并遇到同样的问题。这个解决方案对我有用。我不知道是否有办法让复选框仅在文件上传时出现。