2016-04-21 74 views
0

中實時獲取數據包我正在編寫一個使用各種bioconductor註釋數據包的R包。具體的數據包隨使用情況而變化。因此,我有一個函數,確實是這樣的:使用'require'包代碼在R

if (!require(biocpack_name, character.only=T)) { 
    source("https://bioconductor.org/biocLite.R") 
    BiocInstaller::biocLite(biocpack_name) 
    require(biocpack_name , character.only=T) 
} 

biocpack_name可以是幾個正在擡頭基於正在分析的特定數據〜30 +註釋數據包。因此,我不想每個添加'建議'(我甚至不知道這是否會工作,因爲錯誤不是爲一個包,而是一個指定包的字符串)。 R CMD CHK給我這個錯誤:

'library' or 'require' call not declared from: ‘biocpack_name’ 
'library' or 'require' call to ‘biocpack_name’ in package code. 

我該如何解決這個問題?

回答

1

這不是一個錯誤,而是一個警告。它會消失,如果你使用character.only = TRUE而不是T(我猜是因爲TRUE的值是已知的,不能重新分配,但T是未知的,可以是任何東西,包括FALSE)。但另外請遵循警告中的建議使用requireNamespace()(並且不污染用戶搜索路徑);也許db = get(biocpack_name, getNamespace(biocpack_name))將允許您按照自己喜歡的方式使用註釋包,例如mapIds(db, ...)

如果有人迂腐,將這些軟件包添加到DESCRIPTION文件的Enhances:字段將告知您的軟件包以某種方式與註釋軟件包一起工作,但不會導致軟件包的安裝(例如,用於構建小插曲)除非明確要求。

+0

將T更改爲TRUE已解決的問題。不確定的方法建議可以工作,因爲包在一個函數中被加載,然後被另一個函數使用。 'db'不會是創建它的函數的本地部分嗎? – alexvpickering

+1

是的,你不得不想一想你的功能是如何設計的;也許上面的代碼被稱爲'get_db()',每次需要時都返回db符號? –

+0

我嘗試按建議操作,但遇到了錯誤。例如,如果'biocpack_name < - 「hgu95av2.db」'和返回的對象稱爲'db'。以下工作可以得到一些示例鍵:'鍵< - AnnotationDbi :: keys(db)[1:5]'。但是,'AnnotationDbi :: mapIds(db,keys,「SYMBOL」,keytype =「PROBEID」)''和'AnnotationDbi :: select(db,keys,「SYMBOL」)'失敗,並且'object'hgu95av2ORGPKG'not found' – alexvpickering