修复knitr中xtable中的舍入R值

时间:2017-10-13 14:22:50

标签: r knitr xtable

有没有人想出一个解决方案来调整knitr文档中显示的舍入R值,可以是\Sexpr{}还是xtable?键入?round会返回Note that for rounding off a 5, the IEC 60559 standard is expected to be used, ‘go to the even digit’

使用xtable显示数据框中的计算数字时,我的问题是以下情况。如果值分别显示在表格的单独列中,则读者会认为存在计算错误:

2.5 + 3.1 = 5.6

将显示为

2 + 3 = 6

当R舍入数字时(我已将有效数字设置为0,因为观众不需要更多详细信息)。无论显示多少小数位,都可能发生这种情况(我想避免显示任何小数位!)。

我对内联表达式使用以下内容,但是我很少在段落中插入数字,它通常不会显示为计算。对于小于10且大于-10的数字,这将显示1位小数,并且应在以0.5结尾的偶数上向上舍入。

number_hook <- function(x) {
  if (is.numeric(x)) {
    if (x < 10 & x > 0 | x < 0 & x > -10) {
      y = prettyNum(x, 
                    small.mark = ".", 
                    digits = 2)
      return(y)

    } else if (sign(x) == 1) {
      y = x + 0.5
      y = trunc(y)
      y = prettyNum(y, big.mark = ",", small.mark = ".", digits = 0)
      return(y)

    } else if (sign(x) == -1) {
      y = x - 0.5
      y = trunc(y)
      y = prettyNum(y, big.mark = ",", small.mark = ".", digits = 0)
      return(y)
    }

  } else {
    x
  }
}

任何帮助,解决方法或建议都表示赞赏!谢谢!

我也访问了this similar question

1 个答案:

答案 0 :(得分:1)

我的原始推荐无效。首先,你应该修改你原来的功能。

number_hook <- function(x) {
  ifelse(abs(x) < 10 & abs(x) > 0, prettyNum(x, small.mark = ",", digits = 2), trunc(x))
}

这应该简化if语句的数量。然后你可以使用:

xtable::xtable(dplyr::mutate_if(iris, is.numeric, number_hook))

将函数应用于数据框中的每个数字列。

尝试一下:

foo <- data.frame(a = rnorm(10), b = rnorm(10, 10), c = rnorm(10, -10))
xtable::xtable(dplyr::mutate_if(foo, is.numeric, number_hook))

你应该得到你需要的价值。