使用选择框从用户输入数据集创建回归公式

时间:2019-05-09 23:30:35

标签: r shiny

我正在尝试在R Shiny中自定义构建用户界面回归工具以进行练习(即,我自己的一般用例版本的spss)。我在从用户上传的数据集生成回归公式的关键步骤中遇到了麻烦。我希望用户能够从下拉菜单中选择一个因变量(并最终将这些生成的变量转换为服务器代码中的公式)。

我尝试在textOutput(names(userdata()))函数的choices参数中使用selectInput(),以便用户在上传数据集后可以选择将哪个变量作为因变量。但是,这会生成数据集的 properties 列表,而不是列本身的名称。

我研究了其他人已经使用过的反应性数据集的其他用途,但似乎没有人准确地完成了我想做的事情,或者我在搜索它们时表现不佳。 (这似乎是Shiny的最常见的可能用例,所以我无法想象现在还没有人想到这个,但是我什么也找不到)

library(shiny)
library(wired)

ui <- fluidPage(
  sidebarLayout(sidebarPanel(
    fileInput("FileInput", "Input Your Data Set (Must be .csv)"),
    wired_select(inputId = "responsevar",
                 label = "Dependent Varibale:", 
                 choices = textOutput(outputId = "variable_names")
    )

  ), #sidebar panel
  mainPanel(
    tabsetPanel(
      tabPanel("Table",
               DT::dataTableOutput("table")
      )
    ) #tabset Panel
  ) #main panel
  ) #sidebarlayout
) #fluidpage


server <- function(input, output, session) {
  datasetInput <- reactive({
    infile <- input$FileInput
    if (is.null(infile))
      return(NULL)
    read.csv(infile$datapath, header = TRUE)
  })

  output$table = DT::renderDataTable(datasetInput())

  output$variable_names <- reactive({
    if (is.null(datasetInput()))
      return(NULL)
    names(datasetInput()) 
  })
} #server


shinyApp(ui = ui, server = server)

2 个答案:

答案 0 :(得分:1)

let result: Result<Int, EntropyError> if count < AsyncRandomGenerator.entropyLimit { // Produce numbers until reaching the entropy limit. result = .success(Int.random(in: 1...100)) } else { // Supply a failure reason when the caller hits the limit. result = .failure(.entropyDepleted) } 用于将文本输出到Shiny UI。这包括生成适当的HTML。由于textOutput期望使用R对象而不是HTML代码,因此不太可能。

一种可行的方法是使用wired_select(..., choices = ???)。我不知道它是否具有与有线库等效的功能,但是在基本的光泽下,我会:

  • 不加选择地初始化updateSelectInput

  • 选择数据后,更新下拉菜单中的选择

尝试以下操作:

selectInput

答案 1 :(得分:0)

嗯...由于上述方法不适用于wired库,因此我建议另一种可能的方法。 (我无法在自己的环境中安装有线网络,如果这样更好,请您道歉。)

这里的想法是使选择器成为动态R对象(UI对象)的一部分。然后,如果加载了文件,则取决于该文件的UI对象也会更新。

library(shiny)
library(wired)

ui <- fluidPage(
  sidebarLayout(sidebarPanel(
    fileInput("FileInput", "Input Your Data Set (Must be .csv)"),
    uiOutput("selector")
  ), #sidebar panel
  mainPanel(
    tabsetPanel(
      tabPanel("Table",
               DT::dataTableOutput("table")
      )
    ) #tabset Panel
  ) #main panel
  ) #sidebarlayout
) #fluidpage

server <- function(input, output, session) {
  datasetInput <- reactive({
    infile <- input$FileInput
    if (is.null(infile))
      return(NULL)
    read.csv(infile$datapath, header = TRUE)
  })

  output$table = DT::renderDataTable(datasetInput())

  output$selector <- renderUI({
    choices <- NULL
    if(!is.null(datasetInput()))
        choices <- names(datasetInput())
    wired_select(inputId = "responsevar",
                 label = "Dependent Varibale:", 
                 choices = choices)
 })

} #server

我的原始答案的主要区别是uiOutput代替了selectInputrenderUI的输出组件,而不是观察者。