R(此处为文档样式)中的scan()的替代方法

时间:2019-04-08 11:46:29

标签: r rstudio

我正在寻找一种将文本读入向量的方法,以使每一行都是不同的元素,所有这些都发生在R脚本中。

我发现的一种方式是:

bla <- scan(text = "line1
            line2
            line3",
            what = character())

哪个正确地给了我

> bla
[1] "line1" "line2" "line3"

但是,有几个问题。首先,它是缩进的。我没有必要,但是任何自动缩进功能都会将其弹出以对齐(我通常使用)。其次,如果我想使用双引号,那么这需要转义代码。

是否有一种方法可以在R脚本中执行类似于Here-Document方法(<< EOF)的操作?

我将RStudio用作IDE,在Windows上运行。最好有一种独立于平台的方法。


编辑

  

您是否需要在R脚本中包含文本?

是的

我想做的事的例子:

R script here
⋮
bla <- <SOMETHING - BEGIN>
line1
line2
line3
<SOMETHING - END>
⋮
more R script here

再次要求我可以自由键入,而不必担心自动缩进使行向前移动,也不必担心在键入"之类的代码时使用转义代码。

3 个答案:

答案 0 :(得分:2)

我认为这两个问题都可以通过scan函数和两个小技巧来解决:

scan(text = '
line1
"line2" uses quotation mark
line3
', what = character(), sep = "\n")

Read 3 items
[1] "line1"                         "\"line2\" uses quotation mark"
[3] "line3"  

将引号放在自己的一行中时,自动缩进就没有问题(使用RStudio测试)。如果文本中只有双引号,则可以使用单引号来开始和结束字符对象。如果文本中有单引号,请对字符使用双引号。如果两者兼有,则可能应使用搜索和替换功能使它们统一。

我还添加了sep = "\n",所以每一行都是所得字符向量的一个元素。

答案 1 :(得分:1)

如果可以选择编写Rmarkdown文档而不是R脚本,我们可以使用knitr cat引擎

---
title: "Untitled"
output: html_document
---

```{cat engine.opts=list(file='foo')}
line1
line2
"line3"
'line4'
```

```{r}
bla <- readLines("foo")
bla
```

答案 2 :(得分:1)

从R版本4.0开始,我们有了原始字符串(请参见?Quotes

bla <- r"(line1
line2
"line3"
'line4'
    Here is indentation
Here is a backslash \
)"

#> [1] "line1\nline2\n\"line3\"\n'line4'\n    Here is indentation\nHere is a backslash \\\n"

请注意,尽管它给出一个字符串,而不是单独的元素。我们可以使用strsplit将其拆分:

bla <- strsplit(bla, "\n")[[1]]
                      
#> [1] "line1"                  
#> [2] "line2"                  
#> [3] "\"line3\""              
#> [4] "'line4'"                
#> [5] "    Here is indentation"
#> [6] "Here is a backslash \\"