错误"无法打开连接"在执行"编织HTML"在RStudio

时间:2014-11-18 12:58:42

标签: r rstudio knitr

我在RStudio中尝试“编织HTML”时遇到以下错误。

  |................................                                 |  50%
  ordinary text without R code

  |.................................................................| 100%


processing file: Preview-b0c112a265.Rmd
label: unnamed-chunk-1

Quitting from lines 16-26 (Preview-b0c112a265.Rmd) 
Error in file(file, "rt") : cannot open the connection
Calls: <Anonymous> ... withVisible -> eval -> eval -> read.csv -> read.table -> file
Execution halted

我在64位win8机器上使用RStudio。

7 个答案:

答案 0 :(得分:19)

当您运行“编织HTML”时,代码会尝试在.Rmd所在的同一目录中查找您正在读取的文件,因为knitr将工作目录设置为该路径。据我所知,你有两种选择。

  • 尝试指定文件的绝对路径(不是非常健壮,但在某些情况下很方便)。
  • 找出文件的相对路径。如果.Rmd中有/个文件,/data中有数据,则相对路径应为read.table("./data/myfile.csv"...).表示“在这里”(getwd()所在的位置),两个点向上爬上目录结构,同时指定目录爬下结构。

答案 1 :(得分:5)

有时候Rmd文件的执行路径很烦人,特别是当rmd文件没有存储在项目的根文件夹中时。我在Report文件夹中正常存储rmd以避免项目根目录中的所有临时文件(例如Report / myreport.Rmd)。

例如,Resources文件夹中有一个文件myfile.csv。在rmd文件中,我需要使用两个点来指定文件路径:

read.csv('../Resources/myfile.csv')

但是如果我想在Rstudio项目的控制台中测试我的代码,那么文件路径是不正确的,因为正常的工作目录是项目的根文件夹。所以我需要从文件路径中删除两个点:

read.csv('Resources/myfile.csv')

我写了一个简单的函数来为我自己解决这个问题(https://github.com/byzheng/rproject)。函数project_filepath将生成一个相对于项目根文件夹的新路径。因此工作目录可以是项目中的任何子文件夹。下面的代码适用于Rmd文件和控制台。

library(rproject)
read.csv(project_filepath('Resources/myfile.csv'))

答案 2 :(得分:1)

以下内容对我有用-如果您的项目(例如,名为my_project的目录)的组织方式如下:

enter image description here

在文件夹scripts中,您有一些要编织的*.Rmd*.rmd)文件或某些*.R*.r)脚本/编译为HTML报告(RStudio中的CTRL + SHIFT + K),则可以选择以下选项:

```{r setup, include=FALSE}
knitr::opts_knit$set(root.dir = '../') 
# Or use multiple `../` if needed; 
# One `../` means go one level up towards the root,
# here, moving from `scripts` folder to the root `my_project`
```

或使用绝对路径;但是不建议您与同事共享目录/存储库(在Windows上,C:/my/absolute/path/to/my_project之类的东西在其他任何计算机上均不起作用,并且如果您移动my_project也将在您的计算机上失败)

```{r setup, include=FALSE}
knitr::opts_knit$set(root.dir = 'absolute/path/to/my_project/')
```
  • 2)对于*.R脚本和*.Rmd文件(尽管Note of the help of knitr::knit中不鼓励使用)-您可以将脚本放在*.R的顶部,或者在*.Rmd文件的代码块中(您在其中读取一些数据)如下所示:
setwd(gsub(pattern = '/scripts', replacement = '', x = getwd()))

如果运行/执行*.R脚本而不进行编译(例如在测试脚本时),它将不会更改常规的getwd()路径,因为它找不到/scripts模式。编译为HTML时,它将通过从/scripts删除path/to/my_project/scripts部分来编辑工作目录路径

这两个选项都可以让您继续使用相对路径,例如:

read.csv('data/my_data.csv')

避免出现类似情况:

read.csv('../data/my_data.csv')

如果要在将脚本编译为HTML报告之前对其进行测试,这可能会很棘手。

答案 3 :(得分:0)

您需要像其他作者提到的那样设置项目文件夹的绝对路径或相对路径。你也可以setwd(路径)。

但这对我来说还不够。由于某种原因,我发现我需要在.Rmd文件的第一个R命令块上加载我的所有数据,否则我会得到相同的你错了。

换句话说:

```{r}
setwd("/tmp/report")
# This load works
data1 <- read.csv("your_file.csv", sep = "\t")
````

some markdown text here ...

```{r}
# This load does not work, even if I do a setwd just before:
data1 <- read.csv("your_file.csv", sep = "\t")
````

答案 4 :(得分:0)

对我来说,这只是一个不保存我的.Rmd文件的情况......如上所述,代码试图在.Rmd所在的同一目录中找到该文件,并且.Rmd不会#39; t存在,您可能会收到此错误。

答案 5 :(得分:0)

我不知道何时将其作为全局选项的一部分,但是正如我偶然发现的那样,它没有写在这里: 在全局选项-> Markdown下,有一个设置:“评估目录中的块”,当您使用“当前”或“项目”时,这至少对我有用(显然默认情况下它设置为“文档”)

答案 6 :(得分:0)

我在 Dropbox 文件目录中处理项目时遇到了这个问题。我暂停了 Dropbox 同步,不再有问题。