R Shiny - 在单独的表格中显示线性、多项式和立方体回归的总结。

问题描述 投票:0回答:1

我是R和R Shiny的新手。我目前正在尝试创建一个R Shiny应用程序,以显示一个选定地点的年海平面值的线性(y~x)、二次(y~x^2+x)和三次(y~x^3x^2+x)回归结果的摘要。 期限是由用户从范围滑块中选择起始年和结束年来决定的,而位置是由用户从下拉框中选择的。 然后,我想从用户选择的数据中生成一个线性、二次和三次回归模型,并在不同的表格中显示每个回归摘要结果。

到目前为止,我已经成功地根据用户选择的参数生成了一个过滤后的数据表,其中包含线性、二次和三次回归模型的列。 然而,当我尝试使用以下方法生成回归结果时 LinearModel <- lm(input$var ~ ., data = dt) 这是我从一个 答疑解惑,我得到的错误是 Error in as.data.frame.default(data, optional = TRUE) : cannot coerce class ‘"function"’ to a data.frame.

在我的代码中,线性回归、二次回归和三次回归所使用的数据表都是单独显示的。 这是为了提供信息,同时也作为一个占位符,以替换相关的回归结果。

最后,我希望数据显示为整数,但当我尝试用 my_data[,-1] <-round(my_data[,-1],0) 它仍然显示到小数点后两位?

非常感谢

布莱恩

library(shiny)

Year <- c(2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009)
Year2 <- Year^2
Year3 <- Year^3
Auckland <- c(1760, 1549, 1388, 1967, 1326, 1765, 1814, 1693, 1502, 1751)
Wellington <- c(2176, 3154, 1138, 1196, 2132, 3176, 4181, 5169, 3150, 4175)
Lyttelton <- c(2176, 3154, 1138, 1196, 2132, 3176, 4181, 5169, 3150, 4175)
my_data <- as.data.frame(cbind(Year,Year2,Year3, Auckland,Wellington, Lyttelton))
my_data[,-1] <-round(my_data[,-1],0) #Convert my_data to integers - doesn't work? 

ui <- fluidPage(
  titlePanel("New Zealand Annual Mean Sea Level (MSL) Regression Summary"),

  sidebarLayout(
    sidebarPanel(
      helpText("Annual Mean Sea Level Summary for various locations around NZ."),

      selectInput("var", 
                  label = "Choose a Location",
                  choices = c("Auckland",
                              "Lyttelton",
                              "Wellington"),
                  selected = "Auckland"),

      sliderInput("range", 
                  label = "Choose a start and end year:",
                  min = min(my_data$Year), max = max(my_data$Year), value = c(2003, 2008),sep = "",)
    ),
    mainPanel(
      tableOutput("LinearRegression"),
      tableOutput("QuadraticRegression"),
      tableOutput("CubicRegression")
    )
  )
)
server <- function(input, output) {

  output$LinearRegression <- renderTable({
    dt <- my_data[my_data$Year >= input$range[1] & my_data$Year <= input$range[2],]
    dt[,c(input$var,"Year")]
  },include.rownames=FALSE)
  #Below line doesn't work?
  #LinearModel <- lm(input$var ~ ., data = dt)

  output$QuadraticRegression <- renderTable({
    dt <- my_data[my_data$Year >= input$range[1] & my_data$Year <= input$range[2],]
    dt[,c(input$var,"Year","Year2")]
  },include.rownames=FALSE)
  #Below line doesn't work?
  #QuadraticModel <- lm(input$var ~ ., data = dt)

  output$CubicRegression <- renderTable({
    dt <- my_data[my_data$Year >= input$range[1] & my_data$Year <= input$range[2],]
    dt[,c(input$var,"Year","Year2","Year3")]
  },include.rownames=FALSE)
  #Below line doesn't work?
  #CubicModel <- lm(input$var ~ ., data = dt) 
}
shinyApp(ui, server)
r dataframe shiny regression linear-regression
1个回答
1
投票

你把每个模型的数据从各种? renderXXXX 调用,并使其成为一个反应式。 你可以使用是作为表渲染器和回归汇总输出的输入。 另外,从 lm 不是一个表,所以你不能使用 renderTable 来渲染它。 最后,在插入 input$var 进入你 lm 呼叫。

所以,我已经改变了你的 tableOutput("LinearRegression")VerbatimTextOutput("LinearRegression"). 然后,在服务器上...

  filteredData <- reactive({
    dt <- my_data[my_data$Year >= input$range[1] & my_data$Year <= input$range[2],]
    dt[,c(input$var,"Year")]
    dt
  })

  output$LinearRegression <- renderPrint({
    lm(formula(paste(input$var, "~ .")), data = filteredData())
  })

你可以用类似的方式修改其他的输出。

顺便说一句,你的数据不是 整洁. I 强烈 建议你这样做。 现在的一点努力,将来会给你省去很多痛苦。

© www.soinside.com 2019 - 2024. All rights reserved.