我有一个闪亮的应用程序,我可以读取具有特定格式的文件,应用程序绘制数据,然后我可以交互式注释绘图。我最近更新了应用程序,以便它可以考虑列表中目录中的所有文件,然后使用' next'按钮我可以在文件之间轻弹并逐个注释:
filed=list.files()
library(shiny)
ui <- fluidPage(
actionButton("nex","next"),
......
column(6,plotOutput("plot", click = "plot_click1")),
......
column(1,actionButton("submit1","add to list")),
column(6,actionButton("write results to file","write"))
)
server <- function(input, output) {
value= reactiveVal(1)
observeEvent(input$back, {
newValue <- value() - 1 # newValue <- rv$value - 1
value(newValue) # rv$value <- newValue
})
observeEvent(input$nex, {
newValue <- value() + 1 # newValue <- rv$value + 1
value(newValue) # rv$value <- newValue
})
df <- reactive({
f=paste(filed[value()])
df=read.table(f,header=F)
df
})
click_saved1 <- reactiveValues(singleclick = NULL)
observeEvent(eventExpr = input$plot_click1, handlerExpr = { click_saved1$singleclick <- input$plot_click1 })
rv=reactive({
if(input$nex){
m=data.frame(x=0,y=0)
}else{
m=data.frame(x=0,y=0)
}
})
observeEvent(input$submit1, {
if (input$submit1 > 0) {
rv$m <- rbind(rv$m,unlist(click_saved1$singleclick))
}
})
output$plot<- renderPlot({
df=df()
rv=rv()
x<-df$distance
y<-df$frequency
s=ceemdan(y, ensemble_size = 1000)
par(mar=c(5,5,5,5))
plot(x,y)
points(rv$m$x[-1],rv$m$y[-1], pch=16, col="red", cex=1)
})
output$lin=renderPlot({
rv=rv()
x<-df$distance
y<-df$frequency
m=as.data.frame(cbind(x=seq(1,nrow(rv$m)-1),y=rv$m$x[-1]))
fit=lm(y~x, data=m)
plot(m$x,m$y)
abline(fit)
legend("topleft", bty="n", legend=paste("NRL:",round(coef(fit)[-1], digits = 2), "Error:",round(summary(fit)$coefficients[-1 , 2]), digits=2),cex=1.2)
})
observeEvent(eventExpr = input$write, handlerExpr = {
df=df()
rv=rv()
x<-df$distance
y<-df$frequency
write.table(paste(filed[value(),],round(coef(fit)[-1], digits = 2),
round(summary(fit)$coefficients[-1 , 2]),sep='\t'),'NRLs.txt',append = T,quote=F,col.names=F,row.names=F)
})
}
shinyApp(ui, server)
情节注释涉及在我觉得有趣的点上点击情节,这些点&#39;位置被反复给予数据框:
ui.R
column(1,actionButton("submit1","add to list")),
server.R
rv=reactiveValues(m=data.frame(x=0,y=0))
observeEvent(input$submit1, {
if (input$submit1 > 0) {
rv$m <- rbind(rv$m,unlist(click_saved1$singleclick))
}
})
我的问题: 就是当我点击下一个&#39;按钮移动到需要注释的下一个文件,无效数据框不会重置到data.frame(x = 0,y = 0)。这是必需的,因为每个文件都不同。因此,我试图纠正这个:
rv=reactiveValues({
input$nex
m=data.frame(x=0,y=0)})
这会导致应用立即崩溃并返回错误:
Error in .getReactiveEnvironment()$currentContext() :
Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)
我也尝试过:
rv=reactive({
if(input$nex){
m=data.frame(x=0,y=0)
}else{
m=data.frame(x=0,y=0)
}
})
observeEvent(input$submit1, {
if (input$submit1 > 0) {
rv$m <- rbind(rv$m,unlist(click_saved1$singleclick))
}
})
然后我指定了&#39; rv = rv()&#39;在每个代码的服务器部分。
在这种情况下,图表会渲染,但是当我在图表上选择一个点并点击“添加到列表”时,按钮应用程序崩溃并显示错误:
Warning: Error in seq.default: 'to' must be of length 1
这是一个技术错误,我在seq命令中使用seq命令在代码的一部分中创建另一个数据帧 - &#39; m = as.data.frame(cbind(x = seq(1,nrow(rv $ m) ))中,y = RV $ M $ X))&#39;
然而,当我恢复正常时,这段代码工作正常,并且反应数据帧&#39; rv&#39;不依赖于下一个按钮...
我认为通过“添加到列表中”为数据框添加点数&#39;按钮与rv对象对&#39; next&#39;的依赖性相冲突。按钮。
有人可以帮忙吗?
答案 0 :(得分:0)
如果您需要在每次单击按钮时重置被动数据帧/对象,可以按如下方式实现:
rv=reactiveValues(m=data.frame(x=0,y=0))
observe({ if (input$button == 0)
return()
rv$m <- data.frame(x=0,y=0)
})
因此,每次点击图表并添加到列表中时,&#39;单击按钮 - 数据框被赋予新行。当单击下一个时,数据框将被重置。
ui.R
plotOutput("plot", click = "plot_click1")
server.R
click_saved1 <- reactiveValues(singleclick = NULL)
observeEvent(eventExpr = input$plot_click1, handlerExpr = { click_saved1$singleclick <- input$plot_click1 })
rv=reactiveValues(m=data.frame(x=0,y=0))
observeEvent(input$submit1, {
if (input$submit1 > 0) {
rv$m <- rbind(rv$m,unlist(click_saved1$singleclick))
}
})
observe({ if (input$button == 0)
return()
rv$m <- data.frame(x=0,y=0)
})