使用as.character将表达式强制转换为字符时,有没有办法绕过500个字符的限制?

Hen*_*rik 9 expression r character maxlength

我目前正在编写一个适合多项处理树模型的小包(对于不需要的背景信息,网页pdf).

它的作用如下:它从文件中读取模型(即公式)并将它们(通过parse)转换为表达式.之后,这些表达式中的一些变量被另一个文件中的其他变量交换(即应用了模型限制).因此,模型被转换为字符(via as.character),并且交换是通过gsub.
问题:如果单个表达式超过500个字符,则通过as.character将它们截断为500个字符(或左右)来将它们转换回来.
?as.character得到:

as.character将语言对象的组件截断为500个字符(在1.3.1之前大约为70).

这是一个例子:

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

expr1 <- parse(text = text1)
text2 <- as.character(expr1)
[1] 504
Run Code Online (Sandbox Code Playgroud)

问题:你能解决这500个字符的限制吗?

我知道如果我们在第一次解析模型之前应用限制(即交换变量),我们就可以解决这个问题.但是,这将涉及大量编程,因为整个事情基本上已经准备就绪,如果我们能够以另一种方式解决这500个字符限制,那将会很棒.

fab*_*ans 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)
Run Code Online (Sandbox Code Playgroud)

更重要的是,您可以使用deparse从公式中创建字符串,并使用此函数:

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

绕过使deparse添加换行符并将单个表达式拆分为多个字符串的愚蠢长度限制,比较:

(f <- formula(paste("X ~", paste(rep(letters, 10), collapse=" + "))))
deparse(f)
safeDeparse(f)
Run Code Online (Sandbox Code Playgroud)