我有一个复杂的Shiny应用程序。我有一个selectize
输出对象,selectTest
,它的值由反应对象isTestReady
读取。 isTestReady
评估某些条件是否满足selectTest
。 isTestReady
然后用于各种块作为门。我已将selectTest
设置为outputOptions(suspendWhenHidden = F, priority 999)
以确保它立即启动并运行。强制反应块进行评估
在运行时,我注意到selectTest
的块首先被执行。当isTestReady
在此之后运行时,它仍将selectTest
的值读取为NULL,而不是在第一个块中分配给selectTest
的任何值。在返回重新评估isTestReady
之前,Shiny会经过许多其他模块。重新评估后,其他块再次被调用,现在它们运行良好。
这是预期的行为?如果是这样,那么关于如何让我的场景按照我描述的方式发挥作用?
实施例 -
library(shiny)
library(shinydashboard)
# Setup Shiny app UI components -------------------------------------------
ui <- dashboardPage(
dashboardHeader(),
## Sidebar content
dashboardSidebar(
sidebarMenu(
uiOutput('someelement'),
textOutput('temp2')
)
),
dashboardBody()
)
# Setup Shiny app back-end components -------------------------------------
server <- function(input, output) {
output[['someelement']] = renderUI({
selectizeInput(
inputId = 'someelement',
choices = letters,
selected = letters[1],
label = 'Custom Functions',
multiple = F
)
})
outputOptions(
output,
'someelement',
suspendWhenHidden = F
)
temp = reactive({
print('?')
input[['someelement']]
})
observe({
print('!')
print(temp())
})
output[['temp2']] = renderText({
print('!!')
print(temp())
'-'
})
}
# Render Shiny app --------------------------------------------------------
shinyApp(ui, server)
的日志输出到控制台用于上述应用如下所示 -
[1] "!"
[1] "?"
NULL
[1] "!!"
NULL
[1] "!"
[1] "?"
[1] "a"
[1] "!!"
[1] "a"
任何方式,以避免NULL?在我的应用程序中,有很多块查找temp()
,所有这些块都在temp()
之前运行。
相关,但不是一个解决方案 - http://stackoverflow.com/questions/30378310/shiny-renderui-selectinput-returned-null?rq=1 – TheComeOnMan
可以绑定'eventReactives'也与其他反应。像这样:'eventReactives {temp(),{}}'。 –
@PorkChop,我正在基于'temp()创建新的输出对象,所以'eventReactive'不是一个选项。除非我做杂乱的“本地”等业务。 – TheComeOnMan