我有一個複雜的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