2017-08-29 70 views
0

我有一個相當大的反應數據集,它是通過輪詢文件,然後在預定義時間間隔內讀取該文件而得到的。數據經常更新並需要不斷重新加載。無可否認,重新加載可以逐步完成並附加到R中的現有對象,但不是。不過目前,這個動作是針對閃亮應用的每個用戶完成的,儘管數據在會話中是相同的。在Shiny中共享用戶會話之間的反應數據集

我想出了一個有關解決方案的唯一方法是確定會話是否是第一個,並讓該會話成爲通過輪詢更新數據的主數據。如果仍然存在master,則後續會話不進行投票。

有沒有更簡單的方法來完成相同的結果,而無需處理這種主關係?

這幾乎就像是需要一個全局函數內部的被動調用來代表所有客戶/會話。

回答

0

我希望我能理解這個問題。我假設數據集對於所有會話和所有連接都是相同的。 I.e .:如果一個用戶更新數據集,那麼它應該爲所有其他會話更新?如果是這樣的話,我只需簡單地從數據庫讀取數據,並在每次用戶更新數據庫時寫入該數據庫。如果你有一個MySQL數據庫,你可以使用它。或者,您可以在應用程序中使用特定於應用程序的SQLite數據庫文件,並且可以將它與您的server.rui.r文件以及所有其他特定於應用程序的文件放在一起。

您仍然可以按照預定義的時間間隔從數據庫讀取數據。這樣您就不會在RAM中保留數據副本,並避免爲每個Shiny會話多次加載它。

另一種選擇可能是這樣的。 此外,在您的server.r文件中,每次創建會話(即每次用戶將其瀏覽器指向您的應用程序時),您放入您的shinyServer()函數的任何內容都會運行。任何你放在你的shinyServer()函數(例如最初)的函數只會在runApp()命令初始化你的應用程序時運行一次。因此,如果您將數據集一次加載到shinyServer()函數的外側並將其保存到全局環境變量中,那麼它應該可供所有會話訪問。每個會話都需要重新保存到全球環境中。

assign("main_df", df, envir = .GlobalEnv)

+0

所有的好建議。能否在'shinyServer()'之外分配一個全局反應變量?我相信我曾嘗試過,但沒有成功。我會再次測試。這幾乎就像我需要在'shinyServer()'外面查詢/更新數據集並更新一個全局反應變量,因此當全局數據發生變化時,每個用戶的視圖都會更新。 – theGreatKatzul

+0

你是對的,你不能在'shinyServer()'之外創建一個_reactive_變量,但你可以在全局R環境中創建一個變量,這個變量可以從任何函數和/或循環訪問,也可以在你的Shiny服務器和反應函數。更多關於R的環境在這裏:https://stat.ethz.ch/R-manual/R-devel/library/base/html/environment.html但我會先嚐試數據庫選項。爲什麼不按照我以前的建議創建一個數據庫MySQL或SQLite?這樣,應用程序將具有可擴展性,因爲數據幀不需要完全加載到應用程序中,也不會使用RAM –