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

TMS*_*TMS 46 r

我在使用公式方面遇到问题.我要做的是将公式连接到图表的标题.但是,当我尝试使用与文本一样的公式时,我失败了:

model <- lm(celkem ~ rok + mesic)
formula(model)
# celkem ~ rok + mesic
Run Code Online (Sandbox Code Playgroud)

这可以.现在我想构建字符串"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"
Run Code Online (Sandbox Code Playgroud)

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

Jul*_*ora 37

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"
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

这是因为width.cutoff = 60L?deparse.

  • 不再有 `Reduce(paste, deparse(.))` 或 `paste(deparse(.),collapse=' ')`:R 4.0.0(2020-04-24 发布)引入了 deparse1,它永远不会将结果拆分为多个字符串(参见[我的答案](/sf/answers/4405136781/)) (4认同)
  • Erghh,我对删除很热心,但是现在看来这很欺骗!必须有一些函数可以将公式转换为字符串,而无需包装,截断等! (2认同)

G. *_*eck 26

试试format:

paste("my text", format(frm))
## [1] "my text celkem ~ rok + mesic"
Run Code Online (Sandbox Code Playgroud)

  • 当我尝试你的例子时它工作但是,是的,我现在检查了源代码,它确实称为`deparse`.似乎`deparse(fo,cutoff.width = 200)`有效,但在使用`format`时无法将该参数传递给deparse. (3认同)

Die*_*nne 12

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

celkem = 1
rok = 1
mesic = 1
model <- lm(celkem ~ rok + mesic)
paste("my model ", deparse(formula(model)))
Run Code Online (Sandbox Code Playgroud)


TPA*_*row 8

最简单的方法是这样的:

f = formula(model)
paste(f[2],f[3],sep='~')
Run Code Online (Sandbox Code Playgroud)

完毕!


jan*_*glx 8

R 4.0.0 (released 2020-04-24) introduced deparse1 which never splits the result into multiple strings:

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"
Run Code Online (Sandbox Code Playgroud)


但是,它仍然有一个width.cutoff参数(默认值(最大值): 500) 之后引入换行符,但行分隔符 (collapse默认值: " ") not \n,留下额外的空白(即使有collapse = "")(gsub如果需要,用于删除它们,请参阅罗斯 D 的答案):

> 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"
Run Code Online (Sandbox Code Playgroud)

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

#  Part of the R package, https://www.R-project.org
#
#  Copyright (C) 1995-2019 The R Core Team
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  A copy of the GNU General Public License is available at
#  https://www.R-project.org/Licenses/

deparse1 <- function (expr, collapse = " ", width.cutoff = 500L, ...) 
    paste(deparse(expr, width.cutoff, ...), collapse = collapse)

Run Code Online (Sandbox Code Playgroud)


TMS*_*TMS 6

我找到了一个解决方案,但它很丑陋......

paste(formula(model)[c(2,1,3)], collapse = " ")
Run Code Online (Sandbox Code Playgroud)

事实上,这是太hacky(特别是__CODE__)我不认为这是一个真正的解决方案...请发布更好的东西:-)

  • R 4.0.0(2020-04-24 发布)引入了 deparse1,它永远不会将结果拆分为多个字符串(请参阅[我的答案](/sf/answers/4405136781/)) (3认同)