Подтвердить что ты не робот

Как преобразовать формулу 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, но я думаю, что это такая основная вещь, что она заслуживает решения в среде по умолчанию!

4b9b3361

Ответ 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 символами. По крайней мере, это одна функция, которая, скорее всего, уже загружена...