簡體   English   中英

在 R 包安裝中延遲數據加載如何工作?

[英]How does lazydata loading work in R package installation?

我想公開已經發布在我的 R 包框架的 data/ 目錄中的數據。 有關“外部數據”共享基礎知識,請參閱此鏈接: http : //r-pkgs.had.co.nz/data.html

我的數據以 .txt 格式存儲。 如果您不想通過延遲加載加載數據,只需通過加載 R 包 require(myRpackage) 然后執行 data(datasetName) 加載...您可以使用許多 read 正常讀取數據.table(), read.csv2() 函數在基礎 R 中。

在這個例子中,我的數據集被稱為“publishedData.txt”,可以如下加載,效果很好:

tmp = read.table("/dir/to/R/package/data/publishedData.txt", sep="\t", header=TRUE)

但是,當我使用這個新的閃亮且精彩的數據重新安裝我的 R 包時,我一遍又一遍地收到以下失敗消息(請參見下面粘貼的內容)。

Downloading GitHub repo myGitRepo/myRpackage@master
from URL https://api.github.com/repos/myGitRepo/myRpackage/zipball/master
Installing myRpackage
library='/Library/Frameworks/R.framework/Versions/3.5/Resources/library' -- 
install-tests 
* installing *source* package ‘myRpackage’ ...
** R
** data
*** moving datasets to lazyload DB
Error in scan(file = file, what = what, sep = sep, quote = quote, dec = 
dec,  : 
  line 1 did not have 215 elements
ERROR: lazydata failed for package ‘myRpackage’
* removing 
‘/Library/Frameworks/R.framework/Versions/3.5/Resources/library/myRpackage’
Installation failed: Command failed (1)

請注意,上面的 Github 存儲庫不是真實的。 我正在寫一篇通用的文章,所以不要嘗試自己安裝這個假的 R 包。

我的問題:當我不知道如何執行延遲數據加載時,如何調試延遲數據加載? 即,什么代碼決定我的數據/文件夾中的publishedData.txt 中的數據是“A-OK”還是“Not OK”? 我知道他們正在使用 scan(),但它應該知道 .txt 文件中的 sep="\\t" ,除此之外,我不確定是什么讓它絆倒了?

我嘗試過的事情:

  1. 我已經盡可能地清理了我的標題名稱(例如,從列或行名稱字符串中刪除非字母字符)。

  2. 除了包含字符串數據而不是數字數據的 rownames 列之外,我還刪除了任何其他列,以防萬一在惰性數據加載中將 stringsAsFactors 設置為默認值 TRUE(這會大大減慢速度)。

  3. 另外,我在每次重新安裝嘗試后都重新啟動了 R...

好的,所以我想出了一種方法來讓它工作,而不必真正了解是什么絆倒了它。

假設您的數據集使用 read.table() 加載,但不會如上所述使用延遲數據加載重新安裝。 很有可能,您的標題/行名已關閉。 一個快速的解決方案就是這樣做:

# Load your data into R the way it works
tmp = read.table("/dir/to/R/package/data/publishedData.txt", sep="\t", header=TRUE)
# Write data to same file with these arguments
write.table(tmp, file="/dir/to/R/package/data/publishedData.txt", sep="\t", row.names = TRUE, col.names = TRUE)

然后,使用 git 更新您的 Github 存儲庫,然后嘗試重新安裝 R 包。 這一次會奏效的! .txt 文件的不同之處在於 col.names 的標題 - 第一個“列”沒有與行名關聯的標簽。 它只是以數據矩陣第 1 列的 col.name 開頭。 然后,在第 2 行,第 2 行的行名稱開始,然后是所有數據。 因此,從技術上講,如果您要使用不同的方法解析此數據,則第 1 行中的元素比第 2 行少 1 個元素。

希望它可以幫助別人。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM