【问题标题】:Passing variable names to model in shiny app将变量名称传递给闪亮的应用程序中的模型
【发布时间】:2013-09-12 11:26:23
【问题描述】:

我正在使用闪亮创建一个用于简单线性回归的应用程序。我想自动将变量名传递给模型。我尝试了来自用户的可变输入。 server.R 中的代码是

lm(paste(input$dependent," ~ ",input$independent), data=data1())

lm(paste0(input$dependent) ~ paste0(input$independent), data=data1())

并且还尝试了以下语法;

lm(names(data1()[2]) ~ names(data1()[1]) , data=data1())

这些都不行...
如何将变量名称传递给模型?
提前谢谢...

【问题讨论】:

  • input 是什么类型的对象(例如 data.frame)?现在您告诉lm()data1 中搜索数据,而如果我理解正确,则因变量和自变量在对象input 中。如果确实存储了所有需要的变量input,你可以只做lm(dependent ~ independent, data=input)。但也许您可能需要查看update.formula
  • 我有一个名为“data1”的数据集。它有 2 列,标题为“var1”和“var2”。我不想像'lm(var1~var2,data = data1)'这样的模型直接给变量名称。无论我选择什么数据,它都应该自动将变量名带入模型中。
  • 他们怎么不工作了?有哪些错误或意外结果?
  • 是的,下面的代码正在运行; lm(paste(input$dependent," ~ ",input$independent), data=data1()) 但是在回归摘要中它没有显示正确的公式。它显示了我们在代码中输入的内容。 Call: lm(formula = paste(input$dependent, " ~ ", input$independent), data = data1()) Coefficients: (Intercept) Age_in_Months 64.928 0.635
  • 还有下面显示的错误; Error in parse(text = x) : <text>:2:0: unexpected end of input 1: ~ ^ Warning in model.matrix.default(mt, mf, contrasts) : the response appeared on the right-hand side and was dropped

标签: r shiny


【解决方案1】:

您的示例不够完整,我无法理解您遇到了什么错误,但我认为这应该可以解决问题:

    lm(as.formula(paste(input$dependent," ~ ",paste(input$independent,collapse="+"))),data=dat)

一个垃圾测试表明它能够创建动态模型(尽管需要在其他方面进行一些调整):

ui.R

library(shiny)

shinyUI(pageWithSidebar(
  headerPanel("Test Shiny App"),

  sidebarPanel(
    selectInput("dependent", "Dependent Variable:", c("x","y","z")),
    uiOutput("independent")
  ),

  mainPanel(tableOutput("regTab"))
))

服务器.R

library(shiny)

dat <- data.frame(x=rnorm(100),y=rnorm(100),z=rnorm(100))

shinyServer(function(input, output, session) {

  output$independent <- renderUI({
    checkboxGroupInput("independent", "Independent Variables:",names(dat)[!names(dat) %in% input$dependent],names(dat)[!names(dat) %in% input$dependent])
  })

  runRegression <- reactive({
    lm(as.formula(paste(input$dependent," ~ ",paste(input$independent,collapse="+"))),data=dat)
  })

  output$regTab <- renderTable({
    if(!is.null(input$independent)){
      summary(runRegression())$coefficients
    } else {
      print(data.frame(Warning="Please select Model Parameters."))
    }
  })

})

【讨论】:

    【解决方案2】:

    您基本上需要将公式对象传递给lm 调用。 我发现这比使用paste0 更容易。这个问题更多的是关于formula 而不是闪亮,还有其他方法可以做到这一点。

    predictors = paste(input$independent,collapse="+")
    fml = as.formula(sprintf('%s ~ %s', input$dependent, predictors))
    fit = lm(fml, data=dat)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 2022-11-20
      • 1970-01-01
      • 2014-12-29
      相关资源
      最近更新 更多