10

私は現在、多項処理ツリーモデルに適合するはずの小さなパッケージを作成しています(背景情報が不要なため、 Webページpdf)。

ファイルからモデル (つまり、数式) を読み取り、それらを ( 経由でparse) 数式に変換します。後で、これらの式の変数の一部が別のファイルの他の変数と交換されます (つまり、モデルの制限が適用されます)。したがって、モデルは ( 経由でas.character) 文字に変換され、交換は 経由で行われgsubます。
問題: 1 つの式が 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

You can, by doing ugly things with deparse and 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)

More to the point of your application, you can use deparse to make strings out of formulas, and use this function:

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

to get around the stupid length limit that makes deparse add linebreaks and split a single expression into many strings, compare:

(f <- formula(paste("X ~", paste(rep(letters, 10), collapse=" + "))))
deparse(f)
safeDeparse(f)
于 2011-03-03T12:50:10.410 に答える
0

アップデート:

Base Version 2.15.0 から、as.character はこの動作をするようになりました

as.character は、言語オブジェクトを 500 文字で改行し、改行を挿入します。

パッケージ バージョンを取得するには、次を使用します。

packageVersion("base")

乾杯

于 2017-09-13T07:03:07.103 に答える