4

我希望能够即时将markdown斜体和粗体转换为乳胶版本(即,给文本字符串返回一个文本字符串)。我以为很容易。错误的!(它仍然可能是)。请参阅我在底部尝试的窗台业务和错误。

我所拥有的(注意在降价中已经转义的起始星号):

x <- "\\*note: I *like* chocolate **milk** too ***much***!"

我想要什么:

"*note: I \\emph{like} chocolate \\textbf{milk} too \\textbf{\\emph{much}}!"

我不喜欢正则表达式,但更喜欢基本解决方案(尽管不是必需的)。

傻事:

helper <- function(ins, outs, x) {
    gsub(paste0(ins[1], ".+?", ins[2]), paste0(outs[1], ".+?", outs[2]), x)
}

helper(rep("***", 2), c("\\textbf{\\emph{", "}}"), x)

Error in gsub(paste0(ins[1], ".+?", ins[2]), paste0(outs[1], ".+?", outs[2]),  : 
  invalid regular expression '***.+?***', reason 'Invalid use of repetition operators'

如果有用的话,我有Ananda Mahto 帮我制作的这个玩具。您可以通过以下方式从报告中访问它wheresPandoc <- reports:::wheresPandoc

编辑每本我试过的评论:

action <- paste0(" echo ", x, " | ", wheresPandoc(), " -t latex ") 
system(action)

*note: I *like* chocolate **milk** too ***much***! | C:\PROGRA~2\Pandoc\bin\pandoc.exe -t latex

EDIT2 Per Dason 我试过的评论:

out <- paste("echo", shQuote(x), "|", wheresPandoc(), " -t latex"); system(out)
system(out, intern = T)

> system(out, intern = T)
\*note: I *like* chocolate **milk** too ***much***! | C:\PROGRA~2\Pandoc\bin\pandoc.exe -t latex
4

2 回答 2

4

inputWindows 上缺少管道使这变得很棘手,但您可以使用以下方式绕过它stdin

> x = system("pandoc -t latex", intern=TRUE, input="\\*note: I *like* chocolate **milk** too ***much***!")
> x
[1] "*note: I \\emph{like} chocolate \\textbf{milk} too \\textbf{\\emph{much}}!"
于 2013-03-21T04:30:56.597 回答
3

注意到我正在窗户上工作?system

这意味着重定向、管道、DOS 内部命令……不能使用

和来自的注释?system2

笔记

system2 是比 system 更便携和灵活的接口,在 R 2.12.0 中引入。它允许重定向输出而不需要在 Windows 上调用 shell,这是一种设置环境变量以执行命令的可移植方式,并且可以更好地控制 stdout 和 stderr 的重定向。相反,system(和 Windows 上的 shell)允许调用任意命令行。使用system2

system2('pandoc', '-t latex', input = '**em**', stdout = TRUE)
于 2013-03-21T04:35:10.630 回答