Ошибка "не удается открыть соединение" при выполнении "knit HTML" в RStudio

Я получаю ошибку ниже при попытке "вязать HTML" в RStudio.

  |................................                                 |  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

Я использую RStudio на 64-битной машине win8.

Ответ 1

Когда вы запускаете "Вязать HTML", код пытается найти файл, который вы читаете, в том же каталоге, где .Rmd находится, потому что knitr устанавливает рабочий каталог на этот путь. Насколько я вижу, у вас есть два варианта.

  • Попробуйте указать абсолютный путь к файлу (не очень надежный, но удобный в некоторых случаях).
  • Выделите относительный путь к файлу. Если у вас есть файл .Rmd в / и данные в /data, относительный путь должен быть, например, read.table("./data/myfile.csv"...). . означает "здесь" (везде, где находится getwd()), две точки поднимаются вверх по структуре каталогов, а указатели каталоги поднимаются вниз.

Ответ 2

Иногда это раздражает путь выполнения файла Rmd, особенно когда файл rmd не хранится в корневой папке проекта. Я обычно сохраняю rmd в папке Report, чтобы избежать всех временных файлов в корне проекта (например, Report/myreport.Rmd).

Например, в папке ресурсов есть файл 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'))

Ответ 3

Следующее работает для меня - если у вас есть ваш проект (скажем, каталог с именем my_project), организованный примерно так:

enter image description here

А в папке scripts вас есть какой-то *.Rmd (*.rmd) или скрипт *.R (*.r), который вы хотите связать/скомпилировать как отчет HTML (CTRL + SHIFT + K из RStudio), затем у вас есть варианты:

  • 1) Только для файла *.Rmd, есть возможность определить путь к вашему рабочему каталогу в верхней части файла (см. Примечание в справке knitr::knit):
'''{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 (хотя это не рекомендуется в примечании о помощи 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.

Ответ 4

Вам необходимо установить абсолютные пути или относительно вашей папки проекта, как упоминают другие авторы. Вы также можете setwd (путь).

Но этого недостаточно для меня. По какой-то причине я обнаружил, что мне нужно загрузить все мои данные в самый первый блок из R-команд в файле .Rmd, иначе я получаю то же самое как вы.

Другими словами:

```{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")
````

Ответ 5

Для меня это был просто случай, когда я еще не сохранил мой файл .Rmd... Как указывалось выше, код пытается найти файл в том же каталоге, где находится .Rmd, а .Rmd doesn 't существует, вы можете получить эту ошибку.

Ответ 6

С тех пор я не знаю, когда это является частью глобальных опций, но, как я только что наткнулся на это, а это не написано здесь: в глобальных опциях → Markdown, есть настройка: "оценивать порции в каталоге" и когда вы используете "current" или "Project" это сработало по крайней мере для меня (по-видимому, по умолчанию установлено "document")