2016-04-02 8 views
8

私のknitrコードで生成された数字はすべてoldfashioned電卓のようには見えません。R、Knitr、Rnw、美しい科学的数字

enter image description here

(10の代わりに、eまたはE・で)最後の1のような番号を取得するための任意のオプションがありますか?

オプション(scipen = ...)にはそのオプションがないようです。

私は情報を検索してきたと私はそれがこの\ numのようにすべての番号を書いて、パッケージsiunitxとラテックス中で直接行うことができることを発見しました{1E-10}

しかし、私はknitrが欲しいですテーブル内の数値を含むすべての数値に対して自動的に実行しました。

PD:何かを印刷するときに[1]を避けるにはどうすればよいですか?

PD2:おそらくgsubで何か?

PD3:
私はこの問題に戻ってきます。自分のテーブルを定義していないとしますが、私はそれを回帰から得て、それを生成するためにxtableを使います。

\documentclass{article} 
\usepackage{siunitx} 
\usepackage{booktabs} 
\sisetup{  group-minimum-digits = {3}, group-separator = {,}, exponent-product = \cdot  } 
\begin{document} 

<<r, results='asis'>>= 

library(xtable) 
data(tli) 
fm2 <- lm(tlimth ~ sex*ethnicty, data = tli) 
xxx <- xtable(fm2) 
print(xxx, booktabs = TRUE) 

@ 
\end{document} 

しかし、うまくいきません。私はどんなオプションを使うべきですか?

これは単なる印刷 enter image description here

と結果であり、これは印刷+ "booktabs = T" +私の機能美()との結果です。 enter image description here についてです。

私はなぜ1の代わりに2つのテーブルを生成するのか分かりません。また、数字が正しく整列していません。 とにかく、私の美しさ()関数に依存したくないのですが、suintxを使って、どうすればいいですか?

答えて

8
--- 
output: pdf_document 
--- 


```{r, results='asis'} 
x <- 6.22e-21 

cat(x) 

cat(sfsmisc::pretty10exp(x, lab.type = 'latex')[[1]]) 
``` 

enter image description here

+0

文書全体にどのように適用しますか? – skan

+0

回帰xtable(lm(...))からテーブルを取得したとします。どのようにあなたのメソッドをそのテーブルに適用しますか? – skan

+0

@skan私が試した例では、xtableは標準(例えばpvalue 2e-16から0.00)に科学記法を変換しました。xtableは書式設定を行い、いくつかの文字を出力するので、出力をgrepして書式を挿入する必要があります。自分で作成した出力の場合は、フォーマットを適用するか、baptisteのように印刷方法を変更することができます。どちらも、単に 'options(something = ...) 'の解決策よりも力強いものになるでしょう。 – rawr

9

私は解決策を考える

--- 
output: 
    pdf_document: 
    keep_tex: yes 
header-includes: 
- \usepackage{siunitx} 
- \usepackage{booktabs} 
--- 

\sisetup{detect-all, tight-spacing=false, exponent-product = \cdot, 
round-mode = figures, 
round-precision = 3} 

```{r, results='asis'} 
as.sci_fy <- function(x) {class(x) <- c("sci_fy", class(x)); x} 
format.sci_fy <- function(x) sprintf("\\num{%e}", x) 
print.sci_fy <- function(x) cat(format(x)) 


x <- 6.22e-21 
as.sci_fy(x) 

d <- data.frame(x=rnorm(10), y=rnorm(10), f=letters[1:10]) 
d <- lapply(d, function(c) if(is.numeric(c)) format(as.sci_fy(c)) else c) 

library(xtable) 
d <- xtable(data.frame(d, stringsAsFactors = FALSE)) 
print(d, type="latex", align = c("l", "l", "l"), 
     table.placement = "!htpb", 
     floating.environment = "table", 
     include.rownames=FALSE, 
     sanitize.text.function = function(x){x}, booktabs=TRUE) 

``` 

enter image description here

+0

何もしないような機能のマイニングとは何ですか? "function(x){x}" – skan

+0

私の 'identity'を掘り下げませんでした。関数を渡さなければならないが、何もしたくないときに必要となる。ここで私は正気を望んでいません。 – baptiste

+0

あなたは誰に関数を渡しますか? 私は理解していると思います、これはすべてのセルで\ num {}を実行する方法です – skan

0

、私はsiunitxに書式を残すことを好むが、Rでの前処理は少し厄介得ることができますこのようなものになる可能性があります

beauty <- function(xx) {cat(gsub("\\s([-+]?[0-9]*\\.?[0-9]+)([eE]([-+]?[0-9]+))\\s", " $\\1\\\\cdot{}10^{\\3}$ ", xx, perl=T)) } 

d <- data.frame(x=1:10*10000, y=1:10*1e22,f=letters[1:10]) 

beauty(print(xtable(d, digits=5, display=c("s","G", "G", "s")), type="latex")) 

とにかく完璧ではありません。 誰かがそれを最適化することができれば素晴らしいでしょう。 とにかくこの機能を追加するためにxtableにリクエストを送信しましたが、最近はあまり開発されていないようです。

もう1つのオプションは、gsubでsanitizeオプションを使用することです。

関連する問題