如何在r-markdown中自动显示字符串中的矩阵?

时间:2018-02-20 18:02:11

标签: r matrix r-markdown

告诉你我的问题。下面的程序应该创建两个相同的矩阵:[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

但输出是: matrix 我怎么解决这个问题?我无法使用第二个版本,因为修改my_string后程序必须正常工作。

提前谢谢。

2 个答案:

答案 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,";\\\\"," ")行(否则它只会删除所有反斜杠),您将获得所需的矩阵。