在 Shiny 中使用反应函数需要有限的 'xlim' 值
need finite 'xlim' values using reactive function in Shiny
我正在尝试构建一个带有自定义文件输入的线性回归 Shiny 应用程序。 Server.R 中的反应函数有问题。反应函数 data returns 一个名为 qvdata 的数据框。当在 renderPlot 中调用 data() 并且我从 qvdata 绘图时,出现以下错误:
"Error in plot.window(...):need finite 'xlim' values"。当我不使用反应函数并在 renderPlot 中进行计算时,不会发生错误。为什么是这样?我希望以后能够在其他渲染函数中调用此数据反应函数,以防止代码重复。
Server.R
library(shiny)
shinyServer(function(input, output) {
data<-reactive({
inFile <- input$file1
if (is.null(inFile))
return(NULL)
#takes in data (In my case .dat file)
qvdata=read.table(inFile$datapath)
names(qvdata)=c("H","Q")
qvdata$Hlog=log(qvdata[,1])
qvdata$Qlog=log(qvdata[,2])
xbar=mean(qvdata$Hlog)
ybar=mean(qvdata$Qlog)
xdif=qvdata$Hlog-xbar
ydif=qvdata$Qlog-ybar
Sxy=sum(xdif*ydif)
Sxx=sum(xdif*xdif)
#point estimates of alfa and beta
qvdata$b=Sxy/Sxx
qvdata$a=ybar-qvdata$b*xbar
qvdata
})
output$contents <- renderPlot({
qvdata=data()
t=seq(0,2,0.01)
abline=qvdata$a+qvdata$b*t
plot(qvdata$Hlog,qvdata$Qlog,type="p",pch=20,col="red")
lines(t,abline,col="black")
})
})
ui.R
library(shiny)
shinyUI(fluidPage(
titlePanel('Linear regression'),
sidebarLayout(
sidebarPanel(
fileInput('file1', 'Choose file')
),
mainPanel(
plotOutput('contents')
)
)
))
您的 data
函数在您的 shiny 应用程序启动时首次运行。由于缺少输入文件,它将 return NULL
。但是您的绘图函数不测试其输入,在这种情况下相当于 plot(NULL)
。如果您测试输入 !is.null()
它应该工作:
output$contents <- renderPlot({
qvdata=data()
if (!is.null(qvdata)) {
t=seq(0,2,0.01)
abline=qvdata$a+qvdata$b*t
plot(qvdata$Hlog,qvdata$Qlog,type="p",pch=20,col="red")
lines(t,abline,col="black")
}
})
转换为标准日期格式对我有用。
使用as.POSIXct()
我正在尝试构建一个带有自定义文件输入的线性回归 Shiny 应用程序。 Server.R 中的反应函数有问题。反应函数 data returns 一个名为 qvdata 的数据框。当在 renderPlot 中调用 data() 并且我从 qvdata 绘图时,出现以下错误: "Error in plot.window(...):need finite 'xlim' values"。当我不使用反应函数并在 renderPlot 中进行计算时,不会发生错误。为什么是这样?我希望以后能够在其他渲染函数中调用此数据反应函数,以防止代码重复。
Server.R
library(shiny)
shinyServer(function(input, output) {
data<-reactive({
inFile <- input$file1
if (is.null(inFile))
return(NULL)
#takes in data (In my case .dat file)
qvdata=read.table(inFile$datapath)
names(qvdata)=c("H","Q")
qvdata$Hlog=log(qvdata[,1])
qvdata$Qlog=log(qvdata[,2])
xbar=mean(qvdata$Hlog)
ybar=mean(qvdata$Qlog)
xdif=qvdata$Hlog-xbar
ydif=qvdata$Qlog-ybar
Sxy=sum(xdif*ydif)
Sxx=sum(xdif*xdif)
#point estimates of alfa and beta
qvdata$b=Sxy/Sxx
qvdata$a=ybar-qvdata$b*xbar
qvdata
})
output$contents <- renderPlot({
qvdata=data()
t=seq(0,2,0.01)
abline=qvdata$a+qvdata$b*t
plot(qvdata$Hlog,qvdata$Qlog,type="p",pch=20,col="red")
lines(t,abline,col="black")
})
})
ui.R
library(shiny)
shinyUI(fluidPage(
titlePanel('Linear regression'),
sidebarLayout(
sidebarPanel(
fileInput('file1', 'Choose file')
),
mainPanel(
plotOutput('contents')
)
)
))
您的 data
函数在您的 shiny 应用程序启动时首次运行。由于缺少输入文件,它将 return NULL
。但是您的绘图函数不测试其输入,在这种情况下相当于 plot(NULL)
。如果您测试输入 !is.null()
它应该工作:
output$contents <- renderPlot({
qvdata=data()
if (!is.null(qvdata)) {
t=seq(0,2,0.01)
abline=qvdata$a+qvdata$b*t
plot(qvdata$Hlog,qvdata$Qlog,type="p",pch=20,col="red")
lines(t,abline,col="black")
}
})
转换为标准日期格式对我有用。
使用as.POSIXct()