在RStudio工作,我使用knitr用大块代码创建pdf文件。在下面的示例中,请注意输出中的##
个字符在三个向量之间的间距不同:
这看起来非常整洁,但是我正在编写一个文档,其中包含只有一行输出的示例,并且我希望所有[1]
都能正确地符合一行另一个。
在示例中,这意味着在##
之后为第二个向量移除一个额外的空格。我只是开始使用针织和乳胶,所以我不确定如何实现这样的事情。某种.tex的后期处理?或者更简单的东西?
答案 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}
输出现在看起来像这样:
我唯一关心的是,对于更长的载体,我需要绕过钩子,我不知道该怎么做。
还可以通过this页面向Rod Alence提供他的例子。