如何将R公式转换为文本?

时间:2013-02-03 09:40:20

标签: 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"

现在我看到包sprint中有一个gtools函数,但我认为这是一个基本的东西,它在默认环境中值得一个解决方案!!

9 个答案:

答案 0 :(得分:34)

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

答案 1 :(得分:22)

尝试format

paste("my text", format(frm))
## [1] "my text celkem ~ rok + mesic"

答案 2 :(得分:11)

或作为Julius版本的替代品(注意:您的代码不是自包含的)

celkem = 1
rok = 1
mesic = 1
model <- lm(celkem ~ rok + mesic)
paste("my model ", deparse(formula(model)))

答案 3 :(得分:6)

我找到了一个解决方案,但它很难看......

paste("my text", paste(as.character(formula(model))[c(2,1,3)], collapse = " "))

事实上,这太苛刻了(特别是c(2,1,3))我不认为这是一个真正的解决方案......请发布更好的内容: - )

答案 4 :(得分:3)

最简单的方法是:

f = formula(model)
paste(f[2],f[3],sep='~')

完成!

答案 5 :(得分:2)

这是一个使用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"

答案 6 :(得分:2)

R 4.0.0(发布于2020-04-24)引入了deparse1,它从未将结果拆分为多个字符串:

f <- y ~ a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + 
     p + q + r + s + t + u + v + w + x + y + z
deparse(f)
# [1] "y ~ a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + " "    p + q + r + s + t + u + v + w + x + y + z"                   
deparse1(f)
# [1] "y ~ a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z"



但是,它仍然具有一个width.cutoff参数(默认(最大值):500),此后引入换行符,但各行之间用collapse分隔(默认值:{{1} })而不是" ",留下多余的空白(即使使用\n也是如此)(如果需要,请使用collapse = ""删除它们,请参见Ross D's answer):

gsub

要在R <4.0.0中使用它,请使用backports(推荐) 或复制其实现:

> f <- rlang::parse_expr( paste0("y~", paste0(rep(letters, 20), collapse="+")))
> deparse1(f, collapse = "")
[1] "y ~ a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u +     v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p +     q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k +     l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + a + b + c + d + e + f +     g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z"

答案 7 :(得分:1)

然后添加gsub以删除空格

gsub("  ", "", paste(format(frm), collapse = ""))

答案 8 :(得分:0)

另一种基于 let opened = false; // set the nav as closed by default if ($(window).width() > 720) { function toggleNav() { if(!opened) { // if opened is false (ie nav is closed), open the nav openNav() } else { // else, if opened is ture (ie nav is open), close the nav closeNav(); } opened = !opened; // negate boolean to get opposite (t to f, and f to t) } }else{ function toggleNav2() { if(!opened) { openNav2() } else { closeNav2(); } opened = !opened; } } function openNav() { $('#myTopnav').addClass('openHeight').removeClass('closeHeight'); $('#main').addClass('openMain').removeClass('closeMain'); } function closeNav() { $('#myTopnav').removeClass('openHeight').addClass('closeHeight'); $('#main').removeClass('openMain').addClass('closeMain'); } function openNav2() { $('#main').addClass('openMain').removeClass('closeMain'); } function closeNav2() { $('#main').removeClass('openMain').addClass('closeMain'); } 的解决方案是deparse(和rlang::expr_text()):

rlang::quo_text()

它们确实具有width参数以避免换行,但是也限制为500个字符。至少它是一个最有可能已经加载的函数...