2015-10-26 91 views
2

一旦用戶選擇了輸入參數,我在Shiny應用程序中運行了相當耗時的計算。爲了確保計算不運行不必要的時候,我做了如下操作按鈕:ShinyR:點擊按鈕後只運行一次代碼

actionButton('seeData','see Data') 

我然後試圖只有這個時候,每個按鈕點擊消耗計算運行一次(永不當沒有按鈕點擊)與下面的代碼:

observeEvent(input$seeData, { 

    ...long, includes several function calls... 

}) 

observeEvent我做參考其他輸入參數。

我發現的是,無論我調整輸入參數多少次,計算都不會第一次運行,直到按下按鈕。 但是,一旦我按下按鈕一次,只要有任何輸入參數改變,計算就會運行。當我只按下一次按鈕時,代碼爲什麼會運行第二次,第三次,第四次(等)?

我的目標似乎是剛剛typical use case,但我想有一些棘手與observeEventobserveisolate方面,我不理解。我在做什麼錯了,我該如何實現一個點擊一個計算功能?

+0

'observeEvent'只觸發一個事件,而不觸發其他可能被反應的變量。如果你需要,請嘗試'觀察'而不是。其次,你需要存儲一個變量* somewhere *,默認(說)爲'FALSE',這個'observe *'塊的第一行是'if(!alreadyDone){alreadyDone < - TRUE; ''。 – r2evans

+0

@ r2evans,但我的觀點是,它不會只觸發按鈕單擊。應用程序中沒有其他功能。無論點擊按鈕,參數調整後都會觸發。 – sunny

+0

呵呵,呵呵......我已經試過了,永遠都無法獲得一個'observeEvent'來觸發主參數以外的任何事情。雖然我不認爲我可以提供更多,但當我面對混亂的反應性時,我會用'message'調用其他塊以查看事件鏈。反應性對於良好/有效地控制可能具有挑戰性。對不起,我想我出去了。 – r2evans

回答

0

Here我們可以看到observeEventeventReactive的用法說明。有趣的是,在這個例子中,你可以看到只有當按鈕被點擊的時候,函數的反應纔會被執行。

該方法是定義一個包含要顯示的數據的變量EventReactive。這將使函數保持其值,即使輸入發生變化。它只會在按下按鈕時纔會改變。