R带验证:仅在调整窗口大小后刷新打印

R带验证:仅在调整窗口大小后刷新打印,r,validation,resize,window,shiny,R,Validation,Resize,Window,Shiny,我试图在Shiny中使用validate(),但每次validation命令发现错误时都会遇到问题。我试图绘制一些数据,其中某些子类别的数据有时可能没有任何值(即,如果类别为颜色,则可以选择“绿色”,但有时数据集将不包含类别“绿色”中的任何行) 每当我正在验证的条件返回为false时,错误消息将正确打印。但是,当我重新选择一个新值并进行更新时,新绘图仅在我手动调整窗口大小后显示,而不是在我单击“更新”后显示 colors=c(“绿色”、“蓝色”、“红色”) 图书馆(闪亮) ui问题在于,inpu

我试图在Shiny中使用validate(),但每次validation命令发现错误时都会遇到问题。我试图绘制一些数据,其中某些子类别的数据有时可能没有任何值(即,如果类别为颜色,则可以选择“绿色”,但有时数据集将不包含类别“绿色”中的任何行)

每当我正在验证的条件返回为false时,错误消息将正确打印。但是,当我重新选择一个新值并进行更新时,新绘图仅在我手动调整窗口大小后显示,而不是在我单击“更新”后显示

colors=c(“绿色”、“蓝色”、“红色”)
图书馆(闪亮)

ui问题在于,
input$color
被包装在
insolate
语句中。因此,
need
仍然认为您选择了错误的颜色,因为没有任何信息告诉它重新检查
input$color
。如果您添加
input$go
作为
renderPlot
的第一行(就在
验证之前),我想它会满足您的需要。

这确实解决了它,但我喜欢使用隔离语句,这样在您点击“更新”按钮之前颜色不会改变。你知道为什么在这种情况下,窗口的大小调整会触发更改,而不仅仅是更新按钮吗?你可以保持
隔离
,只需添加按钮的输入即可触发绘图。我的猜测是,当您调整大小时,shiny必须重建绘图,因此它运行
渲染图
,然后重新评估
验证
。太棒了!谢谢,我不知道你可以把动作按钮放在renderplot里。
colors = c("green","blue","red")
library(shiny)

ui <- fluidPage(

  tabsetPanel(
    tabPanel("Info",
             selectInput(inputId = "color",label = "color:",
                         choices = colors,
                         selected = colors[2],
                         multiple = FALSE),
             actionButton(inputId = "go",
                          label = "Update"),
             plotOutput("plot", width = "100%", height = 700,
                        brush = brushOpts(id = "plot_brush",fill = "green",clip = FALSE))

    )
  )
)

server <- function(input, output,session) {

  data = eventReactive(input$go, {
    var1 = rnorm(20,5)
    cat1 = (c(rep("red",10),rep("blue",10)))
    data = cbind.data.frame(var1,cat1)
    plotdata = data[which(data$cat1 ==isolate(input$color)),]

  }
  )

  output$plot = renderPlot({

    validate(
      need(  (isolate(input$color) %in% c("red","blue"))  , "No color of this type " )
    )

    plotdata = data()
    plot(plotdata$var1, col = isolate(input$color)) 
  })
}

shinyApp(ui = ui,server = server)