闪亮的依赖性下降

时间:2018-04-04 20:22:37

标签: r shiny

我正在编写一个闪亮的脚本,其中上传文件,下拉列表显示该文件中的列名称,然后出现第二个下拉列表,其中包含第一个下拉列表中所选文件中列的唯一值。我能够创建第一个下拉列表,但是第二个下拉列表遇到了问题。这是我到目前为止的代码:

ui <- fluidPage(

titlePanel("File Upload Test"),

sidebarLayout(
  sidebarPanel(
     fileInput("file1", "Choose csv file",
               multiple = T,
               accept = c(".csv")),

uiOutput("y_input"),
uiOutput("target_input")),

mainPanel(
plotOutput("contents"))))

server <- function(input, output, session) {

inFile <- reactive({
if (is.null(input$file1)) {
  return(NULL)
} else {
  input$file1}
})

myData <- reactive({
if (is.null(inFile())) {
  return(NULL)
} else {
  read.csv(inFile()$datapath)}
})

output$y_input <- renderUI({
if (is.null(inFile())) {
  return(NULL)
} else {
selectInput("y_output", "Select Y Variable", names(myData()))}
})

output$target_input <- renderUI({
if (is.null(input$y_input)) {
  return(NULL)
} else {
  selectInput("target_output", "Select Target Group", 
              myData( [,input$y_output])}
})
}

感谢任何帮助!这是我关于堆栈溢出的第一篇文章,所以如果这篇文章中有任何格式或清晰的东西我可以/应该修复请告诉我!谢谢!

1 个答案:

答案 0 :(得分:0)

首先提供一些改进代码的技巧:

  1. 使用req
  2. req(name_of_input)if(is.null(name_of_input)) return NULL的简写。它会为您节省几笔,同时提供更好的可读性。

    1. 您的被动名为inFile是不必要的
    2. 使用input $ file1 $ datapath代替。同样,这也更简洁,同时具有更好的性能。

      myData <- reactive({
        req(input$file1)
        read.csv(input$file1$datapath)
      })
      

      最后问题是:

      您对myData的引用是错误的。 [,input$y_output]的子集部分应位于括号之外,如下所示:myData()[,input$y_output]。请记住,即使reactives看起来像函数,它们也不会带任何参数。

      完整服务器.R:

      server <- function(input, output, session) {
        myData <- reactive({
          req(input$file1)
          read.csv(input$file1$datapath)
        })
      
        output$y_input <- renderUI({
          req(input$file1)
          selectInput("y_output", "Select Y Variable", names(myData()))
        })
      
        output$target_input <- renderUI({
          req(input$file1)
          selectInput("target_output", "Select Target Group", 
                      myData()[,input$y_output]
          )
        })
      }
      

      ps:欢迎来到stackoverflow! :)