10

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

它的作用如下:它从文件中读取模型(即公式)并将它们(通过parse)转换为表达式。后来,这些表达式中的一些变量被另一个文件中的其他变量交换(即,应用了模型限制)。因此,模型返回转换为字符(通过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

问题:你能绕过这个 500 个字符的限制吗?

我知道如果我们在第一次解析模型之前应用限制(即交换变量),我们可以解决这个问题。但是,这将涉及大量的编程,因为整个事情基本上都准备好了,如果我们能以另一种方式绕过这 500 个字符的限制,那就太好了。

4

2 回答 2

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)
于 2011-03-03T12:50:10.410 回答
0

更新:

从基本版本 2.15.0 开始, as.character 现在具有此行为

as.character 在语言对象中以 500 个字符换行,并插入换行符。

要获取软件包版本,请使用:

packageVersion("base")

干杯

于 2017-09-13T07:03:07.103 回答