【问题标题】:Fixing inconsistent spacing after ## in output of knitted document修复针织文档输出中##之后的不一致间距
【发布时间】:2014-07-05 08:52:30
【问题描述】:

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

这看起来很整洁,但是我正在编写一个文档,其中包含只有一行输出的示例,我希望所有 [1] 正确地相互对齐。

在示例中,这意味着在第二个向量的## 之后删除一个额外的空格。我才开始使用 knitr 和 latex,所以我不确定我将如何实现这样的目标。 .tex 的某种后处理?或者更简单的东西?

【问题讨论】:

    标签: r pdf latex rstudio


    【解决方案1】:

    这不是knitr 的问题,而是由 R 的打印引起的:

    > 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 补丁)将帮助您澄清(如果)您需要解决方法。

    要集中注意力,请考虑(来自@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 打印向量的方式?

    【讨论】:

    • 看起来它的目的是为了使右括号对齐(第三个示例),但是对于第一个和第二个之间的差异,看起来更像是一个错误。我首先认为这与@gagolews 建议的最大字符数有关,但随后尝试了 20:28 和 20:29,同样的情况发生了。似乎有 10 个项目会触发不同的输出行为。我会尝试 RDevel 的方式。
    • @DominicComtois 对,我希望打印在控制台输出宽度内的矢量具有相同的对齐方式。 20:2820:29 的示例是一个更好的示例,因为在我看来,这里不应该有任何理由将矢量索引移动一个空格。我将添加它作为说明性示例。
    • 对。 R 的逻辑是,如果需要额外的输出行,则右括号将对齐。所以我留下了后处理选项,因为@gagolews 的解决方案不幸导致其他问题(这里解释的时间太长了!)。
    • @gagolews 有什么意义?如果我的控制台有 80 个字符宽度,那么为什么 R 打印 20:2820:29 对我来说毫无意义。
    • Bill Dunlap(来自 TIBCO)对我的 RDevel 帖子提供了明确的答案:“这是因为打印例程希望准备好打印所有彼此对齐的行开头 [index] 标签. 长度的每十次方都需要一个额外的空间。我猜当它这样做时,它不会检查是否需要为向量的尾端制作一个 [index] 标记。”
    【解决方案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 块中使用此功能,请尝试:

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

    【讨论】:

    • 感谢这个有趣的解决方法。唯一的问题是我需要它来覆盖默认的打印方法;每次我需要输出时显式调用该函数并不是一个真正的选择。不知道是否可以覆盖默认打印方法。
    • 您可以查看 knitr 使用的输出钩子并修改它们以删除多余的空间,而不是通过打印函数处理此问题。您可以使用此处显示的代码来实际简化此操​​作,但要使用挂钩函数而不是打印函数。
    • @GavinSimpson 我会研究钩子函数,很可能就是这样。
    【解决方案3】:

    正如 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}
    

    现在的输出如下所示:

    我唯一担心的是,对于更长的向量,我需要绕过钩子,但我不知道该怎么做。

    感谢 Rod Alence 在this 页面上的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多