我遇到了一个问题,因为在加载UI之前会先调用observe。
这是我的ui.R
sidebarPanel(
selectInput("Desk", "Desk:" , as.matrix(getDesksUI())),
uiOutput("choose_Product"), #this is dynamically created UI
uiOutput("choose_File1"), #this is dynamically created UI
uiOutput("choose_Term1"), #this is dynamically created UI ....
这是我的Server.R
shinyServer(function(input, output,session) {
#this is dynamic UI
output$choose_Product <- renderUI({
selectInput("Product", "Product:", as.list(getProductUI(input$Desk)))
})
#this is dynamic UI
output$choose_File1 <- renderUI({
selectInput("File1", "File 1:", as.list(getFileUI(input$Desk, input$Product)))
})
#this is dynamic UI and I want it to run before the Observe function so the call
# to getTerm1UI(input$Desk, input$Product, input$File1) has non-null parameters
output$choose_Term1 <- renderUI({
print("Rendering UI for TERM")
print(paste(input$Desk," ", input$Product, " ", input$File1,sep=""))
selectInput("Term1", "Term:", getTerm1UI(input$Desk, input$Product, input$File1))
})
这是我的观察功能,它在输入$ Product和输入$ File1之前运行,因此我得到一个错误,因为它们都是NULL。但我需要使用UI的输入。
observe({
print("in observe")
print(input$Product)
max_plots<-length(getTerm2UI(input$Desk, input$Product, input$File1))
#max_plots<-5
# Call renderPlot for each one. Plots are only actually generated when they
# are visible on the web page.
for (i in 1:max_plots ) {
# Need local so that each item gets its own number. Without it, the value
# of i in the renderPlot() will be the same across all instances, because
# of when the expression is evaluated.
local({
my_i <- i
plotname <- paste("plot", my_i, sep="")
output[[plotname]] <- renderPlot({
plot(1:my_i, 1:my_i,
xlim = c(1, max_plots ),
ylim = c(1, max_plots ),
main = paste("1:", my_i, ". n is ", input$n, sep = "") )
})
})
}##### End FoR Loop
},priority = -1000)
任何想法如何获取输入$ Product并输入$ File1以便在观察运行之前填充?
谢谢。
答案 0 :(得分:10)
最简单的方法是在每次观察的顶部添加is.null(input$Product)
检查,以防止它在初始化它使用的输入之前运行。
如果您不希望观察者在每次运行时都进行空检查,那么在注册它们时也可以使用suspended = TRUE
参数来阻止它们运行;然后编写一个执行检查的单独观察者,当它发现所有输入都是非空时,在挂起的观察者上调用resume()并暂停自身。
答案 1 :(得分:10)
您需要使用Shiny Event Handler并使用observeEvent
代替observe
。它似乎是摆脱&#34;未处理错误&#34;的唯一方法。应用启动时由NULL值引起的消息。这是因为与observe
不同,事件处理程序默认忽略NULL值。
所以你的观察功能最终会看起来像这样(不需要优先级,或者恢复/暂停等等!)
observeEvent(input$Product, ({
max_plots<-length(getTerm2UI(input$Desk, input$Product, input$File1))
... (etc)
})# end of the function to be executed whenever input$Product changes
)
我无法轻松复制粘贴您的示例代码以使其运行,因此我不完全确定您的完整观察功能会是什么样子。
答案 2 :(得分:3)
您可以使用req()
在执行反应式表达式之前“要求”输入,根据此处的Shiny文档:https://shiny.rstudio.com/articles/req.html和此处的功能文档:https://shiny.rstudio.com/reference/shiny/latest/req.html
例如
observeEvent({
req(input$Product)
req(input$File1)
# ...
})
答案 3 :(得分:0)
我们需要MRE来提供有效的答案,但是,假设您需要input$File1
和input$Desk
,但又不想依赖它们,只需在observe({
product <- isolate(input$Product)
file1 <- isolate(input$File1)
print("in observe")
print(product)
max_plots<-length(getTerm2UI(input$Desk, product, file1))
for (i in 1:max_plots ) {
# ...
}
})
,您可以:
observeEvent(input$Desk, ....)
这可能实际上等同于call_user_func_array([ $this, __FUNCTION__ ], func_get_args());
,但可能提供更大的灵活性。