2013-02-03 1 views
29

テキストと同じように式で作業するのに問題があります。私がしようとしているのは、グラフのタイトルに式を連結することです。しかし、テキストのように数式を処理しようとすると、私は失敗します。R式をテキストに変換するには?

これは問題ありません。今私は"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" 

は今、私はパッケージgtoolssprint機能がある見るが、私は、これはそれが内の溶液に値するような基本的なことだと思いますデフォルト環境!

+2

'sprint'は' gtools'の一部ではありません。誰もがこの投稿の解決策を知っていますか? – zx8754

答えて

6

...実際には

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

を、私は解決策を発見したが、それは地獄のように醜いです、これは私がこの真の解決策を検討していない(特にc(2,1,3))すっごくハックです...

frm <- celkem ~ rok + mesic 
Reduce(paste, deparse(frm)) 
# [1] "celkem ~ rok + mesic" 

library(formula.tools) 
as.character(frm) 
# [1] "celkem ~ rok + mesic" 

Reduce migh:機能as.character.formulaとして、

23

:-)パッケージformula.toolsから短いソリューションをより良いものを投稿してくださいトン長い式の場合に便利です:

ため ?deparsewidth.cutoff = 60Lである
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" 

+0

Aaah、 'deparse'!感謝万円!しかし、なぜあなたは 'Reduce'を使うのですか? 'deparse(frm)'だけで十分です。 – TMS

+0

@Tomasは、 'Reduce'についての説明を追加しました。 – Julius

+1

Erghh、私はdeparseにとても熱心でしたが、今はかなり欺まれているようです!数式を文字列に変換する関数がいくつかあります。 – TMS

9

またはジュリアスのバージョン(注意:あなたのコードは、自己完結型ではなかった)に代わるものとして、ここでは

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

ありがとうDieter .. – TMS

+0

..しかし、それはJuliusによって言及された問題を提起します - 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())'は、Juliusが提案した 'deparse()'とまったく同じように単純化できます: '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への私の追加。 Grothendieck –

+0

これは、それ自身の答えよりも別のポストに対するコメントです。十分な担当者がいれば、投稿にコメントすることができます。自分の投稿にいつでもコメントすることができます。 – BenBarnes

1

最も簡単な方法は次のとおりです。

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

done!

関連する問題