2013-06-28 32 views
3

假設我的一些用戶不能改變他們的R環境,但我需要他們能夠打開RData文件。這些環境文件需要加載一個包(確切地說httpuv)。我們不關心軟件包,我們不需要它的功能,我們只需要獲取數據。有沒有辦法強制R在加載RData文件時繞過加載名稱空間,或者強制R在原始端沒有名稱空間相關性的情況下保存它?謝謝。我可以在繞過加載命名空間的同時加載RData文件嗎?

要重現,請安裝Shiny。從Shiny applet中創建一些R對象並將其保存到服務器的文件系統中作爲RData文件。將文件複製到沒有安裝Shiny或httpuv軟件包的計算機上。嘗試加載RData文件,即使您保存的實際對象完全是與Shiny或httpuv無關的普通data.frames。

我在RData上做了strings,該死的東西充滿了對httpuv的引用。該軟件正在加載文件,然後主動決定不在內部loadFromConn2()函數中繼續。因此必須有辦法讓它停止這樣做。

+0

請給出一個我們可以重現的例子。 – GSee

+4

也許[這有助於](http://www.cybaea.net/Blogs/A-warning-on-the-R-save-format.html) – baptiste

回答

0

真的@baptiste應該在他的評論中獲得一些通用解決方案的鏈接,尤其是R CMD INSTALL --fake技巧,如果他將其轉貼爲答案,我會接受。這就是爲什麼我不接受我自己的以下答案,以引起我的情況的具體問題,但我張貼我的答案,以防其他人幫助。

我保存的一些對象是lm擬合對象。那些包含公式/術語對象(至少兩個,出於某種原因...也許是因爲他們已經通過stepAIC),而這些公式又有一個環境屬性。環境屬性是.GlobalEnv,它可能包含某些包函數的副本。當我挖掘出擬合模型中的對象,然後挖掘這些對象的所有屬性內的對象,然後挖掘這些對象屬性的屬性內的對象...並將我可以找到的每個環境屬性設置爲NULL時,最終我能夠將該擬合模型保存到可以從不同R安裝打開的文件中,而不會出現無法加載名稱空間的錯誤。

我想我也可以編寫一個函數來遍歷擬合模型中的對象及其屬性,並刪除環境,但這聽起來很醜並且很危險。也許有辦法迫使公式和擬合模型不要保留環境,那會更好。目前,除了保存擬合模型之外,我還會在清理我可能在其中找到的任何環境屬性後保存它們的呼叫屬性。如果這不起作用,我會把它們分解成字符串。 PS:我使用RDS格式,但尚未使用RData進行測試,但我懷疑問題在於某些屬性中保存了評估環境,並且與其中的格式無關對象被保存。如果事實證明這不適用於RData,我會發布更新。 PPS:我懷疑我不是唯一一個第一次聽說R CMD INSTALL --fake技巧的人,也許這個詞應該傳播到這個......因爲在其他R用戶不知道的情況下關於它,這仍然是針對R拒絕服務攻擊的明顯向量!


我會接受我自己的答案擺脫SO自動nagger的,但會取消接受,並接受@baptiste如果他們有可能使我將其張貼作爲一個答案這樣做。謝謝。

+1

我不是後代表,不用擔心!很高興這很有幫助 – baptiste

相關問題