Есть ли способ обойти ограничение в 500 символов при приведении выражений к символам с помощью as.character? - PullRequest
9 голосов
/ 03 марта 2011

В настоящее время я пишу небольшой пакет, который должен подходить для моделей дерева многочленной обработки (для не требуется справочная информация веб-страница и pdf ).

Что он делает следующее: читает модель (то есть формулы) из файла и преобразует их (через 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 символов другим способом.

Ответы [ 2 ]

7 голосов
/ 03 марта 2011

Вы можете, делая некрасивые вещи с помощью 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)
}

Чтобы обойти глупое ограничение длины, которое заставляет разноса добавлять разрывы строк и разбивать одно выражение на множество строк, сравните:

(f <- formula(paste("X ~", paste(rep(letters, 10), collapse=" + "))))
deparse(f)
safeDeparse(f)
0 голосов
/ 13 сентября 2017

Обновление:

Начиная с базовой версии 2.15.0, as.character теперь имеет такое поведение

as.character разбивает строки в языковых объектах на 500 символов и вставляет новые строки.

Чтобы получить версию пакета, используйте:

packageVersion("base")

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...