Почему .Traceback разбивает длинные строки на две части?

Я столкнулся со странным поведением объекта .Traceback в R.

Когда я пытаюсь напечатать короткое сообщение об ошибке, все в порядке, и .Traceback[[1]] имеет один элемент. Но когда я пытаюсь напечатать очень длинную строку, объект .Traceback[[1]] становится списком из двух элементов. Смотреть:

>stop(paste("short", "string"))
Error: short string
>.Traceback
[[1]]
[1] "stop(paste(\"short\", \"string\"))"

>stop(paste("very loooooooooooooooooooooooooooooooooooooooooooooooooooooong", "string"))
Error: very loooooooooooooooooooooooooooooooooooooooooooooooooooooong string
>.Traceback
[[1]]
[1] "stop(paste(\"very loooooooooooooooooooooooooooooooooooooooooooooooooooooong\", "
[2] "    \"string\"))" 

Не могли бы вы помочь мне разобраться? Я действительно смущен этим непреднамеренным поведением.


person Philipp Upravitelev    schedule 18.07.2018    source источник
comment
Перелив в новый элемент вектора символов происходит, когда общее # char в paste изменяется с 52 до 53. Также обратите внимание, что в обоих случаях имеется только 1 элемент парного списка; просто больше символьных элементов внутри 1 элемента в случае длинного текста.   -  person Hack-R    schedule 18.07.2018
comment
@ Hack-R Думаю, это можно изменить options справа   -  person akrun    schedule 18.07.2018
comment
@ Hack-R Я не совсем уверен в этом   -  person akrun    schedule 18.07.2018


Ответы (1)


Не могли бы вы помочь мне разобраться?

Кажется, на это повлияло options(width)

stop(paste("very loooooooooooooooooooooooooooooooooooooooooooooooooooooong", "string"))
.Traceback
#R [[1]]
#R [1] "stop(paste(\"very loooooooooooooooooooooooooooooooooooooooooooooooooooooong\", "
#R [2] "    \"string\"))" 

options(width = 9001)
stop(paste("very loooooooooooooooooooooooooooooooooooooooooooooooooooooong", "string"))
.Traceback
#R [[1]]
#R [1] "stop(paste(\"very loooooooooooooooooooooooooooooooooooooooooooooooooooooong\", " "    \"string\"))" 

Однако это не ясно из страницы справки. Хотя в help(".Traceback") написано, что

Вызовы могут печататься более чем в одной строке, ...

Обратите также внимание на from help(".Traceback")

Предупреждение

Недокументировано, где хранится .Traceback, и что это видно, и это может быть изменено.

поэтому, скорее всего, используйте traceback() вместо этого

tr <- traceback()
all.equal(tr, .Traceback)
#R [1] TRUE
person Benjamin Christoffersen    schedule 18.07.2018