Как преобразовать формулу R в текст?
У меня проблемы с работой с формулой, как с текстом. То, что я пытаюсь сделать, это объединить формулу в заголовок графика. Однако, когда я пытаюсь работать с формулой, как с текстом, я терпеть неудачу:
model <- lm(celkem ~ rok + mesic)
formula(model)
# celkem ~ rok + mesic
Это нормально. Теперь я хочу построить строку как "my text celkem ~ rok + mesic"
- вот где проблема:
paste("my text", formula(model))
# [1] "my text ~" "my text celkem" "my text rok + mesic"
paste("my text", as.character(formula(model)))
# [1] "my text ~" "my text celkem" "my text rok + mesic"
paste("my text", toString(formula(model)))
# [1] "my text ~, celkem, rok + mesic"
Теперь я вижу, что в пакете gtools
есть функция sprint
, но я думаю, что это такая основная вещь, что она заслуживает решения в среде по умолчанию!
Ответы
Ответ 1
Краткое решение из пакета formula.tools
, как функция as.character.formula
:
frm <- celkem ~ rok + mesic
Reduce(paste, deparse(frm))
# [1] "celkem ~ rok + mesic"
library(formula.tools)
as.character(frm)
# [1] "celkem ~ rok + mesic"
Reduce
может быть полезна в случае длинных формул:
frm <- formula(paste("y ~ ", paste0("x", 1:12, collapse = " + ")))
deparse(frm)
# [1] "y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + "
# [2] " x12"
Reduce(paste, deparse(frm))
# [1] "y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12"
Это из-за width.cutoff = 60L
в ?deparse
.
Ответ 2
Попробуйте format
:
paste("my text", format(frm))
## [1] "my text celkem ~ rok + mesic"
Ответ 3
или в качестве альтернативы версии Julius (обратите внимание: ваш код не был самодостаточным)
celkem = 1
rok = 1
mesic = 1
model <- lm(celkem ~ rok + mesic)
paste("my model ", deparse(formula(model)))
Ответ 4
Я нашел решение, но оно уродливо, как черт...
paste("my text", paste(as.character(formula(model))[c(2,1,3)], collapse = " "))
На самом деле, это sooo hacky (особенно c(2,1,3)
), я не считаю это реальным решением... Пожалуйста, напишите что-нибудь получше: -)
Ответ 5
Самый простой способ:
f = formula(model)
paste(f[2],f[3],sep='~')
сделано!
Ответ 6
Здесь решение, использующее print.formula
, кажется трюком, но оно выполняет работу в oneline и избегает использования deparse
и не требует использования дополнительного пакета. Я просто фиксирую вывод формулы печати, используя capture.output
paste("my text",capture.output(print(formula(celkem ~ rok + mesic))))
[1] "my text celkem ~ rok + mesic"
В случае длинной формулы:
ff <- formula(paste("y ~ ", paste0("x", 1:12, collapse = " + ")))
paste("my text",paste(capture.output(print(ff)), collapse= ' '))
"my text y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12"
Ответ 7
Затем добавьте gsub для удаления пробелов
gsub(" ", "", paste(format(frm), collapse = ""))
Ответ 8
Еще deparse
нестандартное решение -based - это rlang::expr_text()
(и rlang::quo_text()
):
f <- Y ~ 1 + a + b + c + d + e + f + g + h + i +j + k + l + m + n + o + p + q + r + s + t + u
rlang::quo_text(f)
#> [1] "Y ~ 1 + a + b + c + d + e + f + g + h + i + j + k + l + m + n + \n o + p + q + r + s + t + u"
У них есть аргумент width, чтобы избежать разрывов строк, но он также ограничен 500 символами. По крайней мере, это одна функция, которая, скорее всего, уже загружена...