【问题标题】:Executing bash in RMarkdown on Windows (Git-Bash)在 Windows 上的 RMarkdown 中执行 bash (Git-Bash)
【发布时间】:2018-03-04 02:35:31
【问题描述】:

我想在 RStudio .rmd 文件中执行 bash 语句,如下所示。

```{bash}
ls 
```

起初,RStudio 只会在代码块旁边显示红色按钮。我发现 bash 的 OpenSSH 版本正在打开一个 shell 窗口,所以通过调整 windows 系统路径,我得到了 ...\Git\bin\bash.exe 版本来执行。

然后我得到以下红色错误:

bash: C:\Users\{me}\AppData\Local\Temp\RtmpmEF1jM\chunk-code3cb46c6027b3.: No such file or directory

在 Rmarkdown 页面上似乎可执行的仅有的四个引擎(sh、bash、perl 和 python)中的每一个都会发生这种情况(在块的右侧显示一个小绿色三角形)。这比 this page 上描述的 Python、SQL、Bash、Rcpp、Stan、JavaScript 和 CSS 的语言示例要少,并且比 knitr::knit_engines 对象中包含的 38 个要少得多。

搜索 StackOverflow,我遇到了 this short example,它展示了如何编写自己的语言引擎。所以我修改它来访问Git-Bash shell,注册函数如下:

eng_gitbash <- function( options ) { ... } 
knitr::knit_engines$set( gitbash = eng_gitbash )

但是当我执行块 {r, engine='gitbash'} 时,我得到了这个错误。

'"C:\Users\{me}\AppData\Local\Temp\RtmpmEF1jM\chunk-code3cb476f93db0."' is not recognized as an internal or external command, operable program or batch file.

虽然我已经阅读了很多 Yihui Xie 的优秀文档,但我似乎无法找到如何测试我编写的 eng_gitbash 函数。如果有人能告诉我“options$engine 可以如何在命令行中直接使用来执行代码”,我也许可以让我自己的版本正常工作。

同样作为一个一般性问题,有人可以指出我对语言引擎的环境要求的描述 1) 可被 RStudio 识别为可执行文件和 2) 使用 Windows 临时文件正确执行。

谢谢,苏

【问题讨论】:

    标签: r windows bash rstudio knitr


    【解决方案1】:

    我能够让我的 knitr 语言引擎功能工作并“直接”执行它。这很简单:

    eng_gitbash <- function( options ) {
    
    # create a temporary file
      f <- basename( tempfile( "gitbash", '.', paste('.', "sh", sep = '' ) ) )
      on.exit( unlink(f) )    # cleanup temp file on function exit
      writeLines( options$code, f )
      out <- ''
    
    # if eval != FALSE compile/run the code, preserving output
      if (options$eval) {
        out <- system2( "gitbash.cmd", f )
      }
    
    # spit back stuff to the user
      engine_output( options, options$code, out )
      }
    
    knitr::knit_engines$set( gitbash = eng_gitbash )
    

    它有点像 Rmarkdown 文件中的一种语言块。但正如您从下面的屏幕截图中看到的那样:

    1. 它通过单​​击绿色小三角形来执行。但是1 的输出是什么?
    2. 它使用 CTRL-SHIFT_ENTER 执行。但是没有绿色的小三角形。
    3. 它不执行,它们不是小绿色三角形。

      [上面列出的 3 个块的屏幕截图][1](唉,在我获得 10 个声望点之前,我不能发布图像或两个以上的链接)

    我可以忍受这些问题。虽然,当我在新的 RStudio 测试版中尝试它时,使用 CTRL_ENTER 执行所有三个块都可以正常工作。但是当我去编织整个文件时,我得到了下面下一个屏幕截图中显示的两个错误。

    1. 这个错误是直接在第一个块中执行eng_gitbash函数引起的。
    2. eng_gitbash 函数似乎没有注册,尽管我在编写文件之前获取了一个 R 脚本,并且它在执行单个块时工作。

      [上面列出的 2 个错误的屏幕截图][2](唉,在我获得 10 个声望点之前,我不能发布图片或两个以上的链接)

    编织整个页面的设置与单个块的设置有何不同?

    【讨论】:

    • 因为我不能上传图片,这里是错误信息。
    【解决方案2】:
    processing file: eng_gitbash.Rmd
      |............
      ordinary text without R code
    
      |......................
    label: unnamed-chunk-l
    Quitting from lines 4-8 (eng_gitbash.Rmd)
    Error in eval(expr, envir, enclos) : attempt to apply non-function  Calls:
             <Anonymous> ... handle -> withCallingHandlers -> withVisible -> eval -> eval
    
    Line 4 Error in eval(expr, envir, enclos) : attempt to apply non-function Calls:
             <Anonymous> ... handle -> withCallingHandlers -> withVisible -> eval -> eval
    
    
    output file: eng_gitbash. knit.md
    
    Output created: eng_gitbash.html
    Warning messages:
    1: In get_engi ne(optionsSengi ne) :
      Unknown language engine 'gitbash' (must be registered via knit_engines$set())
    
    2: In get_engi ne(optionsSengi ne) :
      Unknown language engine 'gitbash' (must be registered via knit_engines$set()) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 2016-08-16
      • 2020-07-05
      • 1970-01-01
      • 2016-05-12
      相关资源
      最近更新 更多