2013-02-03 57 views
29

我無法像使用文本一樣使用公式。我想要做的是將公式連接到圖的標題。但是,當我嘗試與文本一起使用公式時,我失敗了:如何將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功能,但我認爲這是這樣一個基本的東西,不愧內的解決方案默認環境!

+2

'sprint'不再是'gtools'的一部分。任何人都知道這個帖子的解決方案是什麼? – zx8754

回答

6

我已經找到了解決方案,但它是醜陋的地獄......

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

其實,這是SOOO哈克(尤其是c(2,1,3))我不認爲這是一個真正的解決方案...請郵寄的東西:-)

23

更好地從包中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 migh噸長公式的情況下是有用的:

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

+0

Aaah,'deparse'!太感謝了!但是,爲什麼你使用'Reduce'?僅僅是「deparse(frm)」就足夠了。 – TMS

+0

@Tomas,剛剛添加了關於'Reduce'的解釋。 – Julius

+1

呃,我對deparse非常熱心,但現在看來這是相當詭詐的!必須有一些函數可以將公式轉換爲字符串*,而不需要包裝,截斷等等。 – TMS

9

或作爲替代朱利葉斯的版本(注意:你的代碼是不是自足)

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

謝謝Dieter .. – TMS

+0

..但要小心,它提出了朱利葉斯提到的問題 - deparse將截斷長公式。 – TMS

+0

有趣......從來沒有想到這一點。 –

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" 
+0

謝謝,但'capture.output(print())'可以簡化爲'deparse()',就像Julius提出的那樣,結果完全一樣:'paste(deparse(frm),collapse ='')'.. 。 – TMS

17

嘗試format

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

謝謝,但是這與包裝長公式具有相同的問題,因爲'deparse'具有,無視寬度和對齊選項... – TMS

+3

當我嘗試你的例子時,它工作,但是,是的,我已經檢查了源,現在它的確稱爲「deparse」。看起來''deparse(fo,cutoff.width = 200)'有效,但在使用'format'時無法將這個參數傳遞給deparse。 –

1

然後加入GSUB刪除空格

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

然後呢?這個關鍵字是不是前面有一個if? –

+0

我加入@G。格洛騰迪克 –

+0

這是對另一篇文章的評論,而不是對其本身的回答。一旦你有足夠的代表,你可以評論任何帖子。你總是可以評論你自己的帖子。 – BenBarnes

1

最簡單的方法是:

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

完成!