在针织文件的输出中##之后修复不一致的间距

时间:2014-05-16 19:23:54

标签: r pdf latex rstudio

在RStudio工作,我使用knitr用大块代码创建pdf文件。在下面的示例中,请注意输出中的##个字符在三个向量之间的间距不同:

knitr pdf output

这看起来非常整洁,但是我正在编写一个文档,其中包含只有一行输出的示例,并且我希望所有[1]都能正确地符合一行另一个。

在示例中,这意味着在##之后为第二个向量移除一个额外的空格。我只是开始使用针织和乳胶,所以我不确定如何实现这样的事情。某种.tex的后期处理?或者更简单的东西?

3 个答案:

答案 0 :(得分:3)

这不是knitr问题,而是来自R&C的打印:

> 1:5
[1] 1 2 3 4 5
> 1:10
 [1]  1  2  3  4  5  6  7  8  9 10
> 1:100
  [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
 [19]  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36
 [37]  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54
 [55]  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72
 [73]  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
 [91]  91  92  93  94  95  96  97  98  99 100

后期处理会使您的输出看起来像是来自R。

我努力在基础R中修复它(如果它确实是一个错误而不是意图),而不是尝试特殊情况。带有上述示例的RDevel电子邮件(在最近的R中确认 - 以上是3.0.x-patched)将帮助您澄清(如果)您需要解决方法。

要集中注意力,请考虑(来自@Dominic Comtois'评论)

> 20:28
[1] 20 21 22 23 24 25 26 27 28
> 20:29
 [1] 20 21 22 23 24 25 26 27 28 29

为什么添加第十个元素会改变R打印矢量的方式?

答案 1 :(得分:2)

这可能不一定是理想的解决方案,但我希望经过一些调整后它会模糊地满足您的需求。

我已经定义了一个“调整过的”打印功能:

print_adj <- function(x, adjpos=6, width=3) {

   # capture output
   con <- textConnection("text", open="w")
   sink(con)
   print(format(x, width=width), quote=FALSE)
   sink()
   close(con)

   library(stringr)
   pos <- str_locate(text, fixed("]"))
   for (i in seq_along(text))
      text[i] <- str_c(str_dup(" ", adjpos-pos[i,1]), text[i])
   cat(text, sep="\n")
}

以这样的方式打印矢量x

  • 方括号]始终出现在给定的文本列
  • 每个元素都占据width个文本列

示例输出:

> print_adj(1:5)
   [1]   1   2   3   4   5
> print_adj(1:10)
   [1]   1   2   3   4   5   6   7   8   9  10
> print_adj(1:100)
   [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28
  [29]  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56
  [57]  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84
  [85]  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100

如果您想在knitr chunk中使用此功能,请尝试:

<<eval=2,echo=1>>=
print(1:100)      # don't eval
print_adj(1:100)  # don't print this cmd
@

答案 2 :(得分:1)

我能够通过定义一个钩子来解决我的问题,正如Gavin Simpson建议的那样。

\documentclass{article}
\begin{document}

<<setup, include=FALSE>>=
require(stringr)
hook.out <- function(x, options) 
  return(str_c("\\begin{verbatim}",
               sub("\\s+\\[1\\]\\s+"," [1] ",x),
               "\\end{verbatim}"))
knit_hooks$set(output=hook.out)
@

<<>>=
1:9
1:10
@

\end{document}

输出现在看起来像这样:

results after hook is applied

我唯一关心的是,对于更长的载体,我需要绕过钩子,我不知道该怎么做。

还可以通过this页面向Rod Alence提供他的例子。