2011-03-03 32 views
8

我目前正在寫一個應該適合多項處理樹模型的小包(對於不需要背景信息a web pagepdf)。將表達式強制轉換爲使用as.character的字符時,是否有辦法避開500個字符的限制?

它的作用如下:它從文件中讀取一個模型(即公式)並將它們(通過parse)轉換爲表達式。之後,這些表達式中的一些變量由來自另一文件的其他變量交換(即,應用模型限制)。因此,該模型會重新轉換爲字符(通過as.character),並通過gsub完成交換。
問題:如果單個表達式的長度超過500個字符,則通過as.character將它們轉換回500個字符(大約)。
?as.character給出:

as.character截斷 語言對象的成分爲500個字符 (約爲70 1.3.1之前)。

下面的例子:

text1 <- paste(rep(LETTERS, 10), collapse = " + ") 
nchar(text1) 
[1] 1037 

expr1 <- parse(text = text1) 
text2 <- as.character(expr1) 
[1] 504 

問題:你能解決這個500字符的限制?

我知道如果我們在第一次解析模型之前應用限制(即交換變量),我們可以解決這個問題。但是,這將涉及到很多編程,因爲整個事情基本上已經準備好了,如果我們能夠以另一種方式解決500個字符的限制,那將是非常好的。

+1

誰能給一個很好的理由,爲什麼這樣的限制將存在於一個現代化的計劃? – 2011-03-03 12:51:58

+0

@大衛這也是我的想法。特別是,爲什麼它是硬編碼的,而不是,例如,在選項中可以改變? – Henrik 2011-03-03 12:54:38

+0

這真是一個靜態大小的數組,'char s [500]'這看起來很蹩腳。也許有一個很好的理由...... – 2011-03-03 12:58:54

回答

7

您可以通過做醜陋的東西與deparse和GSUB:

expr1 <- parse(text = text1) 
attributes(expr1) <- NULL 
(text3 <- paste(deparse(expr1), collapse="")) 
#rm whitespace etc 
(text3 <- gsub("\\)$", "", gsub("^expression\\(", "", 
     gsub("[[:space:]][[:space:]]+", " ", text3)))) 
nchar(text3) 

更多您的應用程序的時候,你可以使用deparse使串出的公式, ,利用此功能:

safeDeparse <- function(expr){ 
    ret <- paste(deparse(expr), collapse="") 
    #rm whitespace 
    gsub("[[:space:]][[:space:]]+", " ", ret) 
} 

避開愚蠢的長度的限制,使得deparse添加換行符和拆單表達成許多字符串,比較:

(f <- formula(paste("X ~", paste(rep(letters, 10), collapse=" + ")))) 
deparse(f) 
safeDeparse(f) 
+0

這聽起來很有趣。我也試着用'deparse'來玩弄。但是在第2行出現'contextstack溢出'。但我會立即嘗試你的版本。 – Henrik 2011-03-03 12:57:05

+0

fabians的代碼在我的機器上運行(Linux上的R 2.10)。 – 2011-03-03 13:13:15

+0

此代碼也適用於我的機器。但是在我的**真實**程序中有一個問題仍然會產生這個錯誤。但是,我正在尋找它的途中...... – Henrik 2011-03-03 13:31:19

0

更新:

從基本版本2.15.0的as.character現在有這種行爲

as.character在500個字符打破了語言對象線,並插入新行。

爲了讓包的版本使用:

packageVersion("base") 

乾杯

相關問題