2016-11-22 103 views
2

我想創建一個R包,在安裝時顯示維護人員的聯繫信息,並要求用戶在我們的安裝列表中要求他們計算它們的權限。在用戶第一次調用我們的某個函數時運行代碼也是可以接受的,而不是立即安裝。無論哪種方式,此消息應該只出現一次(除非用戶重新安裝/更新軟件包)。帶有隻能運行一次的代碼的R包(每次安裝)

我已經考慮:

  • 我知道如何包括供內部使用的數據集,但我不知道如何永久地改變這些數據。
  • 我們可以設置一個環境變量/應用程序設置,但我不知道在會話結束後是否有辦法讓它持續存在。
  • 使用外部服務/服務器會過重,並且不允許不希望被跟蹤的用戶關閉該消息。

有沒有很好的方法來做到這一點?

+0

很多軟件包在'.onAttach'函數中使用'packageStartupMessage'。一個簡短的信息對於一個有用的包是非常合理的。舉例來說,'data.table'宣傳他們的數據營指南。這裏的示例https://github.com/Rdatatable/data.table/blob/f78d7901dc5063a5157d37db4831e418ad021fe6/R/onAttach.R –

+1

OP錯過了(合理的)點,顯示_once並且僅顯示一次。 –

+0

如果你這樣做*請*做它,所以有一種方式,從來沒有*的問題出現,因爲需要用戶交互的安裝讓我哭了。 – Spacedman

回答

4

這可以運行多次,但只能在有限的時間窗口內運行,所以也許它已經足夠好了。

將此代碼添加到您的軟件包中,它會在安裝後7天內加載軟件包時發出消息,之後它將不會再次發出消息,直到軟件包更新。

它通過比較安裝文件創建到當前時間的工作。它不需要寫入任何目錄的權限,只需要讀取,所以它應該一般工作。

.onLoad <- function(libname, pkgname) { 
    ctime <- file.info(find.package(pkgname, libname))$ctime 
    if (difftime(Sys.time(), ctime, unit = "day") < 7) 
     packageStartupMessage("This msg will go away one week after installing this package") 
} 
+0

不錯,避免了存儲狀態,但是......錯過了(合理的)OP由OP顯示_once並且只有一次。 –

+0

不錯的主意,謝謝!在我的情況下,我很舒服,假設讀者只在計劃使用它時才安裝包裝,所以我可以使用很短的時間間隔,從而避免重複顯示。 – octern

3

您可能要咬跨會話子彈和存儲狀態信息,以顯示它一次且僅一次

一些軟件包可以幫助:

但我不確定哪一個讀取寫道。也許最後一個符合法案。

編輯:原來,即使pkgconfig不會在會話中持續保留值。當我控制目錄或數據庫寫入時,我已經用公司本地代碼解決了這個問題。對於公共和便攜式代碼來說,這有點困難。我仍然認爲有一個軟件包可以在所有主要操作系統上存儲用戶級別的配置,但現在我不能記住這個名稱。

編輯2:用點頭的Gabor Csardi刷新我的記憶中,rappdirs解決了便攜提供每個用戶配置文件位置的問題(與其他招數也相應的Python庫的端口) 。將它與一個簡單的CVS或RDS文件結合起來,以存儲最後一次顯示該消息的(完全)您現在可以顯示它一次並且只有一次。升級包後甚至沒有。

1

下面的代碼允許您創建的包庫文件:

activate_file = paste(system.file('extdata', package = 'your_package'), 'activated.txt', sep = '/') 
file.exists(activate_file) 
# FALSE 
file.create(activate_file) 

file.exists(activate_file) 
# TRUE 

現在你可以在.onLoadactivated.txt文件是否存在檢查。第一次顯示該消息,然後創建activated.txt,並且在下一次使用該包時,onload函數會看到該文件並可以跳過該消息。

優點:

  • 持續了會議。
  • 確保用戶具有寫權限來創建文件的平臺獨立方式。

缺點:

  • 重新安裝/升級擦拭activated文件,從而再次顯示該消息。

如果這是不可接受的,你可以嘗試找到一個持久的位置,例如,在家裏駕駛這樣做(例如~/.your_package/activated.txt)。然後挑戰是讓這個平臺獨立。也許看看path.expand(~)以獲得當前用戶主驅動器,不知道這是否適用於Windows。

+0

但你不能假設你可以在那裏寫。它可以以只讀方式掛載。 –

+0

@DirkEddelbuettel True,然後使用安裝程序的homedrive將是一個更好的選擇。 –

+0

我剛剛添加_Edit 2_到我的答案詳細說明。當然有一個包... –