Frage Gibt es eine Möglichkeit, die Grenze von 500 Zeichen zu umgehen, wenn Ausdrücke mit as.character an Zeichen gebunden werden?


Ich schreibe gerade ein kleines Paket, das multinomial verarbeitende Baummodelle (für nicht benötigt Hintergrundinfo a Website und ein pdf).

Was es tut, ist folgendes: Es liest ein Modell (d. H. Formeln) aus einer Datei und konvertiert sie (über parse) zu Ausdrücken. Später werden einige der Variablen in diesen Ausdrücken durch andere Variablen aus einer anderen Datei ausgetauscht (d. H. Modelleinschränkungen werden angewendet). Daher wird das Modell zurück in Zeichen umgewandelt (via as.character) und der Austausch erfolgt über gsub.
Das Problem: Wenn ein einzelner Ausdruck länger als 500 Zeichen ist, wird er über zurück transformiert as.character schneidet sie auf 500 Zeichen ab (oder so).
?as.character gibt:

as.character schneidet Komponenten von   Sprachobjekte zu 500 Zeichen   (war etwa 70 vor 1.3.1).

Hier ein Beispiel:

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

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

Die Frage: Kannst du diese Beschränkung um 500 Zeichen umgehen?

Ich weiß, dass wir dieses Problem umgehen könnten, wenn wir die Einschränkungen anwenden würden (d. H. Die Variablen austauschen), bevor wir das Modell das erste Mal analysieren. Aber das würde eine Menge Programmierung erfordern, da die ganze Sache im Grunde bereit ist, und es wäre großartig, wenn wir diese Beschränkungen um 500 Zeichen auf andere Weise umgehen könnten.


9
2018-03-03 12:15


Ursprung


Antworten:


Sie können, indem Sie hässliche Dinge mit deparse und gsub tun:

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)

Mehr zum Punkt Ihrer Anwendung können Sie verwenden deparse um Strings aus Formeln zu machen, und benutze diese Funktion:

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

Um das dumme Längenlimit zu umgehen, das dazu führt, dass Zeilenumbrüche hinzugefügt werden und ein einzelner Ausdruck in viele Strings aufgeteilt wird, vergleiche:

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

7
2018-03-03 12:50



Aktualisieren:

Ab der Basisversion 2.15.0 hat das as.character jetzt dieses Verhalten

as.character bricht Zeilen in Sprachobjekten mit 500 Zeichen und fügt Zeilenumbrüche ein.

Um die Paketversion zu erhalten, benutzen Sie:

packageVersion("base")

Prost


0
2017-09-13 07:03