2016-11-14 27 views
2

我需要写一些关于使用shell的讲座。我已经完成了100多份Sweaved R文档。当我看到knitr有bash引擎(http://yihui.name/knitr/demo/engines)时,我用它作为测试用例。knitr engine = bash。想要为每个块分别设置工作目录

这工作正常,不是很好。块没有正在进行的会话,每个块评估都从文档的工作目录开始。在 块之间没有意识,所以很难写出关于使用“cd”和“pwd”以一致的方式。

我希望每个块都有一个参数“working.directory”。

如果你知道其他的方式来做到这一点,我全部耳朵。目前,我正在探索Emacs org模式作为替代方案。它有一种方法来设置每个块的工作目录。但风格更难。

这里是我的knitr测试文档,

--- 
title: "Command Line, Shell" 
author: 
- name: Paul Johnson 
    affiliation: Center for Research Methods and Data Analysis, University of Kansas 
    email: [email protected] 
abstract: 
    This uses knitr to interleave shell commands and output. 
Note to Authors: please_dont_change_the_next 4 lines! 
date: "`r format(Sys.time(), '%Y %B %d')`" 
output: 
    html_document: 
    highlight: haddock 
--- 

```{r setup, include=FALSE} 
outdir <- paste0("tmpout") 
options("prompt" = "$ ") 
options("continue" = "$ ") 

if (!file.exists(outdir)) dir.create(outdir, recursive = TRUE) 
knitr::opts_chunk$set(engine="bash", echo=TRUE, comment="output:", 
prompt = TRUE, fig.path=paste0(outdir, "/p-", root.dir="/tmp")) 
options(width = 70) 
``` 

## Getting Started in the Shell 

### Start a Terminal Emulator 
    * Mac (Utilities/Terminal, iTerm, many others) 

    * Windows (Git for Windows provides a BASH shell). Others available (Cygwin, Ubuntu BASH for Windows) 

    * Linux (many terminal programs, some more exciting than others) 

### High points 
    * Type commands, see textual output 

    * Not much pointing and clicking (copy/paste possible on some) 

### What is a Shell? 
    * Computer has many settings that programs can access. A "shell" 
    is a "behind the scenes" program that keeps those settings 
    and passes them out to programs when needed 
    * BASH: Bourne Again Shell, a widely-used shell 
    * Almost all Unix/Mac systems will have many shell programs 
    available, such as "sh", "bash", "dash", and so forth. We 
    are mostly interested in BASH because it has the most user comfort 
    * A terminal program relies on the shell to translate between user and operating system 

#### **Prompt**. Where you type 
    * Prompt might be verbose 
``` 
pauljohn:Documents/Projects $ 
``` 
    * On some it is very lean, just the dollar sign 
``` 
$ 
``` 
    * Dollar sign is customary prompt for non-root user (non-administrators) 
    * Prompt is configurable, it is a good exercise for somebody who has used the Terminal for a week or two on a daily basis. 

## Basic things to type 

#### What is my working directory 
```{r getwd} 
pwd 
``` 

```{r ls} 
ls 
``` 
See there, the output says it is still in my working directory 
where the document is, not "/tmp" as requested. 

The following efforts produce errors if you uncomment them. 

I can't figure even how to change directory with system or Sys.setenv. 

<!-- ```{r whoami5} --> 
<!-- system("cd /tmp") --> 
<!-- ls --> 
<!-- ``` --> 



<!-- ```{r whoami6} --> 
<!-- Sys.setenv(PWD = "/tmp") --> 
<!-- ls --> 
<!-- ``` --> 
+0

大多数knitr非-R会话不是持久的,所以'cd'将无法通过以下的bash进行块。另请参阅https://github.com/yihui/runr。 –

+0

Hi @Yihui。我会尝试跑步者。关于它在knitr页面上的评论并不太热心。 – pauljohn32

+0

对不起,分心。我找到了一个可行的答案,并在下面发布。您是否可以善意地告诉我们是否会由于opts_knitr多次运行而在bash块之间更改root.dir而存在缺陷? – pauljohn32

回答

1

这里是一个可行的解决方案。它没有实现持久的BASH会话,但它实现了与Emacs org-mode相同的解决方法。它允许为各种代码BASH块分别设置工作目录。这几乎与持久的shell会话一样好。

HOWTO?当需要更改工作目录时,使用engine =“R”代码块中的knitr :: opts_knitr重置块之间的root.dir。 bash块遵循新的设置。

只有易慧能告诉我们这是否会导致缓存等危险, R大块内部存在强烈的警告。

下面是一个工作的例子,首先从工作目录“/ tmp”开始,然后是我的主目录“〜”。

--- 
title: "Command Line, Shell" 
author: 
- name: Paul Johnson 
    affiliation: Center for Research Methods and Data Analysis, University of Kansas 
    email: [email protected] 
abstract: 
    This uses knitr to interleave shell commands and output. 
Note to Authors: please_dont_change_the_next 4 lines! 
date: "`r format(Sys.time(), '%Y %B %d')`" 
output: 
    html_document: 
    highlight: haddock 
--- 

```{r setup, include=FALSE} 
outdir <- paste0("tmpout") 
options("prompt" = "$ ") 
options("continue" = "$ ") 

if (!file.exists(outdir)) dir.create(outdir, recursive = TRUE) 
knitr::opts_chunk$set(engine="bash", echo=TRUE, comment="output:", 
prompt = TRUE, fig.path=paste0(outdir, "/p-")) 
options(width = 70) 
knitr::opts_knit$set(root.dir="/tmp") 
``` 

## Basic things to type 

#### What is my working directory. These are BASH chunks, not R chunks! 
```{r getwd} 
pwd 
``` 

```{r ls} 
ls 
``` 

Here is how I change directory for following bash chunks. 
Note engine = bash in this document, so we set R 
engine just for this one 

```{r, engine = "R"} 
opts_knit$set(root.dir="~") 
``` 

```{r ls2} 
ls 
```  

我刚刚上传HTML输出作为证据,这并不编译:

http://pj.freefaculty.org/scraps/test_dummy.html