【问题标题】:R, Knitr, Rnw, beautiful scientific numbersR,Knitr,Rnw,美丽的科学数字
【发布时间】:2016-07-22 12:05:58
【问题描述】:

我希望我的 knitr 代码生成的所有数字看起来都不像老式计算器。

有没有办法得到最后一个数字(用·10代替e或E)?

options(scipen=...) 似乎没有那个选项。

我一直在搜索信息,我发现它可以直接在 LaTex 中使用包 siunitx 完成,将每个数字都写成这样 \num{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}

但是效果不好。我应该使用哪些选项?

这是打印的结果

这是 print+"booktabs=T"+my function beauty() 的结果。 问候。

我不知道为什么它会生成两个表格而不是 1 个表格。而且数字没有正确对齐。 无论如何,我不想依赖我的 beauty() 函数而只使用 suintx,我该怎么做?

【问题讨论】:

    标签: r latex knitr digit scientific-notation


    【解决方案1】:

    我认为解决方案可能是这样的

    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 发送了添加此功能的请求,但最近似乎没有太大的发展。

    另一个选项是使用带有 gsub 的 sanitize 选项。

    【讨论】:

      【解决方案2】:

      我更喜欢将格式留给siunitx,但是R中的预处理可能有点繁琐,

      ---
      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)
      
      ```
      

      【讨论】:

      • 一个似乎什么也没做的函数的挖掘是什么? “函数(x){x}”
      • 我未能挖掘?identity。当您必须传递一个函数但不希望它做任何事情时,它是必需的。在这里我不想理智。
      • 那你把函数传给谁呢?我想我明白了,这是您在每个单元格上执行 \num{} 的方式
      • 想象一下你从回归 xtable(lm(...)) 中得到一个表。您将如何将您的方法应用于该表?
      • 老实说,我对 xtable 了解不多
      【解决方案3】:
      ---
      output: pdf_document
      ---
      
      
      ```{r, results='asis'}
      x <- 6.22e-21
      
      cat(x)
      
      cat(sfsmisc::pretty10exp(x, lab.type = 'latex')[[1]])
      ```
      

      【讨论】:

      • 如何将其应用于整个表格或文档?
      • 想象一下你从回归 xtable(lm(...)) 中得到一个表。您将如何将您的方法应用于该表?
      • @skan 在我尝试的示例中,xtable 将科学记数法转换为标准(例如 pvalue 2e-16 到 0.00)。由于 xtable 会进行格式化并打印出一些字符,因此您可能必须 grep 输出并插入格式。对于您自己创建的输出,您可以像 baptiste 建议的那样应用格式或覆盖打印方法。这两者都比options(something = ...) 解决方案更暴力
      • 我要在 xtable 网站上提交一个请求,要求他们添加一些选项来自动完成。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      相关资源
      最近更新 更多