R/Rstudio console 的指令長度限制
TL:DR:輸入 R/Rstudio console 的指令之容量上限為 4095 bytes。若超出上限,console 會忽略超出的部分,顯示 + 提醒使用者補完剩餘指令。
今天測試定序前處理的 pipeline 時,發現總是無法順利讀檔。為了 debug,我把所有檔案的輸入路徑存為一個字串,並複製到 R console,重跑其中一個 function。結果 console 上印出一個 + 號,function 仍無法運作。
1 | > parse_path("....") # 這是長度約三千多個字符的字串 |
我第一個反應是檢查括弧的數量和位置是否正確,接著仔細看檔案路徑中有沒有跳脫字符。然而,怎麼檢查都沒有留意到語法錯誤,於是開始丟各種長度和內容的字串測試。
後來,我發現只要刪除部分字串,function 又可以順利執行了,所以我猜 R 的字串可能有長度上限?循著這猜想,我在網路上找到不少面臨相似問題的人,例如:
- storing long strings (DNA sequence) in R
- How to bypass RStudio console upper limit on character string length?
最終,我才在這則問題找到答案:輸入的字串被刪節確實是因為其大小超出限制,但並非超出 character 存儲上限,而是超出 R/Rstudio console 的上限。
舉例來說,我們可以用 paste0 和 rep 建立長字串。
1 | seq <- paste0(rep("ABCDEFG", 1000), collapse = "") |
再使用 nchar 統計字串長度。
1 | > nchar(seq) |
然而,若把字串印出,再完整貼到 console 裏執行。由於字串大小超出 console 上限,所以 nchar 便無法順利運作了。
1 | > nchar( "ABCDEFGABCDEFGABCDEFG......" ) |
當然,字串也有其容量上限,這上限應該是取決於記憶體容量。這狀況,R 會直接告訴我們容量不足,而不是顯示讓人困惑的 +。
1 | > seq <- paste0( rep("ABCDEFG", 100000000000000), collapse = "") |
有趣的是,數字再大一點時數字會以科學記號表示,不符合 rep 的輸入規範,也會顯示錯誤。
1 | > seq <- paste0( rep("ABCDEFG", 1000000000000000000000), collapse = "") |
這些道理我都懂,可是,我的 pipeline 是以腳本執行啊,怎麼還會碰到這問題?經過一番苦思,發現 bug 出在我的程式邏輯上,跟本文提到的限制一點關係都沒有。