告诉你我的问题。下面的程序应该创建两个相同的矩阵:[A | b] 1和[A | b] 2。
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE, warning=FALSE, comment = "",
message=FALSE)
```
```{r}
my_string<-"2x+5y-2z+2p=9;\\\\ 3x-2y+1z-3p=34;\\\\ -3x+3y+2z+4p=33;\\\\
2x+3y+4z+5p=125"
x1<-gsub('([[:punct:]]|\\s)([a-z])', '\\11\\2', my_string)
x1<-stringr::str_replace_all(x1,"[a-z]"," & ")
x1<-stringr::str_replace_all(x1,"=","| ")
x1<-stringr::str_replace_all(x1,"[+]","")
x1<-stringr::str_replace_all(x1,";\\\\"," ")
x1<-stringr::str_replace_all(x1,"[&]+[\\s]+[|]"," |")
x1<-stringr::str_replace_all(x1,"[|]","&|&")
```
```{r}
eq1 <- noquote(paste(x1))
```
$$\begin{equation*}
\mathbf{[A|b]1} = \left[\begin{matrix}
`r eq1`
\end{matrix}\right]
\end{equation*}
$$
$$\begin{equation*}
\mathbf{[A|b]2} =
\left[ \begin{matrix}
2 & 5 & -2 & 2 &|& 9 \\ 3 & -2 & 1 & -3 &|& 34 \\ -3 & 3 & 2 & 4 &|& 33
\\ 2
& 3 & 4 & 5 &|& 125
\end{matrix} \right]
\end{equation*}
$$
第一个使用r eq1
,第二个是直接写eq1字符串:
2&amp; 5&amp; -2&amp; 2&amp; |&amp; 9 \ 3&amp; -2&amp; 1&amp; -3&amp; |&amp; 34 \ -3&amp; 3&amp; 2&amp; 4&amp; |&amp; 33 \ 2 &安培; 3&amp; 4&amp; 5&amp; |&amp; 125
但输出是:
我怎么解决这个问题?我无法使用第二个版本,因为修改
my_string
后程序必须正常工作。
提前谢谢。
答案 0 :(得分:0)
问题是,行r eq1
将单个“\”输出到最终结果。尝试加倍斜杠符号。
为了检查结果,请尝试添加以下YAML标题:
---
output:
html_document:
keep_md: yes
---
并检查生成的.md
文件。您会看到两个方程式块不相同,缺少第一个中的双“\”。
答案 1 :(得分:0)
作为@I。 Brum在他的回答中已经说过,在这种情况下,为了实现(直接写入)矩阵中的换行符,需要两个反斜杠\\
。
从技术上讲,它只是一个反斜杠\
被转义(即防止被直接读取为代码),并且在R中逃避某些东西的方式又是反斜杠\
,因此我们必须写两个反斜杠\\
以表达一个\
。
此时,您的eq1
对象包含一个(常规)表达式,该表达式将被传递到rmarkdown数学部分,插入`r eq1`
,这会变得有点复杂。它与正则表达式:
“如果\用作正则表达式中的转义字符,你如何匹配文字\?你需要转义它,创建正则表达式\\。要创建该正则表达式,你需要使用一个字符串也需要逃避。这意味着匹配文字\你需要写“\\\\” - 你需要四个反斜杠来匹配一个!“ (Regular expressions from CRAN, see section Escaping)
所以只需从代码中删除x1<-stringr::str_replace_all(x1,";\\\\"," ")
行(否则它只会删除所有反斜杠),您将获得所需的矩阵。