我是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)
你把每个模型的数据从各种? 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 强烈 建议你这样做。 现在的一点努力,将来会给你省去很多痛苦。