簡體   English   中英

R Markdown 與 read_xlsx 苦苦掙扎,警告:期望合乎邏輯

[英]R Markdown struggling with read_xlsx, Warning: Expecting logical

在我的普通 .R 腳本中運行read_xlsx()時,我能夠讀取數據。 但是,當在 R Markdown 中使用source()運行 .R 腳本時,突然需要很長時間(> 20+++ 分鍾,我總是在結束前終止)並且我不斷收到這些警告消息,它正在評估每一列和期望它是合乎邏輯的:

Warning: Expecting logical in DE5073 / R5073C109: got 'HOSPITAL/CLINIC'
Warning: Expecting logical in DG5073 / R5073C111: got 'YES'
Warning: Expecting logical in CQ5074 / R5074C95: got '0'
Warning: Expecting logical in CR5074 / R5074C96: got 'MARKET/GROCERY STORE'
Warning: Expecting logical in CT5074 / R5074C98: got 'NO'
Warning: Expecting logical in CU5074 / R5074C99: got 'YES'
Warning: Expecting logical in CV5074 / R5074C100: got 'Less than one week'
Warning: Expecting logical in CW5074 / R5074C101: got 'NEXT'
Warning: Expecting logical in CX5074 / R5074C102: got '0'
.. etc

我不能在這里分享數據,但它只是一個普通的 xlsx 文件(30k obs,110 vars)。 數據在所有大寫字母中都有響應,例如 YES 和 NO。 原始數據應用了過濾器、一些額外的工作表和 Excel 中的一些溫和格式(無邊框、白色填充),但我認為這些不會影響它。

我的工作流程設置示例如下:

數據准備.R:

setwd()
pacman::p_load()  # all my packages

df <- read_xlsx("./data/Data.xlsx") %>% type_convert()

## blabla more cleaning stuff

報告.Rmd:

setwd()
pacman::p_load() # all my packages again

source("Dataprep.R")

當我運行Dataprep.R時,一切都在 < 1 分鍾內運行。 但是,當我嘗試從Report.Rmd獲取source("Dataprep.R")時,它在read_xlsx()處開始變慢並給我這些警告。

我也嘗試從Dataprep.R獲取df <- read_xlsx()並將其移動到Report.Rmd ,它仍然與運行source()一樣慢。 我還刪除type_convert()並嘗試了其他方法,例如刪除 Excel 中的額外工作表。 source()也在Report.Rmd的設置塊中,但我把它拿出來還是一樣。

所以我認為這與 R Markdown 和readxl/read_xlsx() 完全相同的代碼和數據在 R 與 Rmd 中的評估結果如此不同,這非常令人費解。

對此有任何見解。 有解決辦法嗎? 或者這是我必須忍受的東西(即轉換為 csv)?

> sessionInfo()
R version 4.2.0 (2022-04-22 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 22000)

Matrix products: default

locale:
[1] LC_COLLATE=English_United Kingdom.utf8  LC_CTYPE=English_United Kingdom.utf8    LC_MONETARY=English_United Kingdom.utf8
[4] LC_NUMERIC=C                            LC_TIME=English_United Kingdom.utf8    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] digest_0.6.29    R6_2.5.1         lifecycle_1.0.1  pacman_0.5.1     evaluate_0.15    scales_1.2.0     rlang_1.0.2      cli_3.3.0        rstudioapi_0.13 
[10] rmarkdown_2.14   tools_4.2.0      munsell_0.5.0    xfun_0.30        yaml_2.3.5       fastmap_1.1.0    compiler_4.2.0   colorspace_2.0-3 htmltools_0.5.2 
[19] knitr_1.39 

更新:

所以在 Markdown 中,我可以使用更通用的read_excel()並且在我的設置塊中工作。 但是,如果我嘗試source()它,我仍然會收到相同的Warning消息,即使來源的 R 腳本也使用read_excel()而不是read_xlsx() 周圍非常令人費解。

當您在 .R(以及可能生成警告的其他類型的代碼)上運行該代碼時,您將獲得警告摘要。 類似於“有 50 個或更多警告(使用 warning() 查看前 50 個)”之類的內容。

而如果您在標准 Rmarkdown 代碼塊上運行相同的代碼,您實際上會收到全部 50 多個警告。 這可能意味着您正在打印數千、數百萬或更多警告。

如果您的問題是為什么會在 Rmarkdown 而不是 R 上發生這種情況,我不確定。

但是,如果您的問題是如何解決它,那很簡單。 只需確保將選項 message=FALSE 和 warning=FALSE 添加到您的代碼塊中。

它應該看起來像這樣:

{r chunk_name, message=FALSE, warning=FALSE}
setwd()
pacman::p_load() # all my packages again

source("Dataprep.R")

現在,關於“setwd()”,我建議不要使用任何改變系統狀態的東西(避免“副作用”功能)。 如果您不是很小心,它們可能會產生問題。 但這是另一天的另一個話題。

暫無
暫無

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

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