【问题标题】:Can't use Rcpp engine in R Markdown无法在 R Markdown 中使用 Rcpp 引擎
【发布时间】:2017-01-20 06:15:51
【问题描述】:

我尝试Knit HTML以下Rmd文件:

---
title: "Untitled"
author: "Florian Privé"
date: "12 septembre 2016"
output: html_document
---

```{r fibCpp, engine='Rcpp'}
#include <Rcpp.h>

// [[Rcpp::export]]
int fibonacci(const int x) {
    if (x == 0 || x == 1) return(x);
    return (fibonacci(x - 1)) + fibonacci(x - 2);
}
```

我收到以下错误:

Building shared library for Rcpp code chunk...
Warning message:
l'exécution de la commande 'make -f "C:/PROGRA~1/R/R-33~1.1/etc/x64/Makeconf" -f "C:/PROGRA~1/R/R-33~1.1/share/make/winshlib.mk" SHLIB_LDFLAGS='$(SHLIB_CXXLDFLAGS)' SHLIB_LD='$(SHLIB_CXXLD)' SHLIB="sourceCpp_2.dll" WIN=64 TCLBIN=64 OBJECTS="file110c1d4643e9.o"' renvoie un statut 127 


Quitting from lines 11-18 (test.Rmd) 
Error in (function (file = "", code = NULL, env = globalenv(), embeddedR = TRUE,  : 
  Error 1 occurred building shared library.
Calls: <Anonymous> ... block_exec -> in_dir -> engine -> do.call -> <Anonymous>
Exécution arrêtée

我做错了什么吗?是不是与 Windows 有关的问题?

来自sessionInfo()的环境信息

R version 3.3.1 (2016-06-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

locale:
[1] LC_COLLATE=French_France.1252  LC_CTYPE=French_France.1252   
[3] LC_MONETARY=French_France.1252 LC_NUMERIC=C                  
[5] LC_TIME=French_France.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] magrittr_1.5    rsconnect_0.4.3 htmltools_0.3.5 tools_3.3.1     yaml_2.1.13    
 [6] Rcpp_0.12.7     stringi_1.1.1   rmarkdown_1.0   stringr_1.1.0   digest_0.6.10  
[11] evaluate_0.9   

Rtools 安装检查通过devtools::find_rtools()

[1] TRUE

来自Sys.getenv()['PATH'] 的结果

## PATH                  C:\Program
##                       Files\R\R-3.3.1\bin\x64;C:\ProgramData\Oracle\Java\javapath;C:\Program
##                       Files\NVIDIA GPU Computing
##                       Toolkit\CUDA\v7.5\bin;C:\Program
##                       Files\NVIDIA GPU Computing
##                       Toolkit\CUDA\v7.5\libnvvp;;C:\Program Files
##                       (x86)\Intel\iCLS Client\;C:\Program
##                       Files\Intel\iCLS
##                       Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program
##                       Files (x86)\Windows Live\Shared;C:\Program
##                       Files\Intel\Intel(R) Management Engine
##                       Components\DAL;C:\Program
##                       Files\Intel\Intel(R) Management Engine
##                       Components\IPT;C:\Program Files
##                       (x86)\Intel\Intel(R) Management Engine
##                       Components\DAL;C:\Program Files
##                       (x86)\Intel\Intel(R) Management Engine
##                       Components\IPT;C:\Program Files
##                       (x86)\Skype\Phone\;C:\Users\Florian\.dnx\bin;C:\Program
##                       Files\Microsoft DNX\Dnvm\;C:\Program Files
##                       (x86)\NVIDIA
##                       Corporation\PhysX\Common;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Users\Florian\Anaconda3;C:\Users\Florian\Anaconda3\Scripts;C:\Users\Florian\Anaconda3\Library\bin;C:\Program
##                       Files
##                       (x86)\Java\jre1.8.0_101\bin\client;C:\texlive\2015\bin\win32

【问题讨论】:

  • 只有时间注意到您的 Rcpp 示例在 macOS、最新的 RStudio Preview、超电流 Rcpp 和 R 3.3.1 上运行良好
  • 对不起,我无法编辑我的帖子,因为其中的代码显然太多了。你可以得到Sys.getenv()['PATH']there的结果。此外,我打开了另一个项目,Rcpp::evalCpp("2 + 2") 工作正常。

标签: r knitr r-markdown rcpp devtools


【解决方案1】:

由于Sys.getenv['PATH'] 的请求信息不包含其中包含Rtools 的路径,并且知道knitr 错误是由无效的engine 路径触发的,我想你正在成为devtools::find_rtools() 在设置上抛出误报的受害者。

这通常是这种情况,因为如果它无法在系统路径上找到Rtools,它会在注册表中扫描Rtools,然后设置一个环境标志。在运行 rmarkdown 或在包构建阶段,环境标志通常不会持续存在。另见:Why do I need to run find_rtools() before has_devel() = TRUE?

例如如果您关闭所有打开的会话 R 会话,然后打开一个 new R 会话并仅输入 Rcpp::evalCpp("2 + 2"),您可能会触发编译错误。

解决这个问题很简单:Rtools 安装位置添加到PATH 系统变量。我维护了一个安装指南,它会逐步引导您完成此过程。 :http://thecoatlessprofessor.com/programming/rcpp/install-rtools-for-rcpp/

从 Rtools 3.4 开始,必须添加到 PATH 的两个位置是:

c:\Rtools\bin;
c:\Rtools\mingw_32\bin;

要在 Windows 上修改 PATH 变量,请参阅:

【讨论】:

    【解决方案2】:

    我也刚刚遇到过这个问题。我发现距离上次解决这个问题已经有几年了,所以我想用我在 2020 年找到的解决方案进行更新。

    我收到了顶部提到的确切错误,并且不得不重新安装 Rtools。我最初有 RBuildTools,它适用于我构建的其他包,但在编译该项目的 cpp 代码时仍然存在问题。我安装了 Rtools40 并保留了所有默认值。然后将我的 Windows 10 机器上的系统路径变量更改为 C:\rtools40\usr\bin。重新启动机器后,knitr 渲染了文档,没有任何进一步的错误。

    Rtools40安装说明可以be found at this link

    我希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      我今天在 Windows 10 上遇到了这个错误,你提供的输出和我的一样好。

      J_F 的解决方法或通过高级系统设置将“c:\Rtools\bin”添加到路径都没有解决它。

      为我解决的问题是卸载 Rtools 并重新安装它,检查安装期间更改路径的选项。我把路径:“c:\Rtools\bin”、“C:\Rtools\mingw_32\bin”、“C:\Program Files\R\R-3.3.1\bin\i386”和“C:\Program Files\R\R-3.3.1\bin\x64" 在那里。

      我想知道为什么通过高级系统设置在路径中添加“c:\Rtools\bin”并没有改变Sys.getenv()['PATH']的输出

      【讨论】:

        【解决方案4】:

        我在 Windows 10 上运行 Rmarkdown {Rcpp} 块时遇到了这个问题。Rcpp 在所有其他情况下都运行良好。

        1. 安装Rtools40(如@aromatic6tet)所说,使其出现在C:\rtools40
        2. 重启机器
        3. 打开工作室
        4. 键入以下内容,注意在路径常量之间使用分号分隔符并使用双反斜杠。 Sys.setenv(PATH = paste(Sys.getenv("PATH"), "C:\\rtools40\\usr\\bin", sep = ";"))

        ...现在 knitr 编译 Rcpp!

        【讨论】:

          【解决方案5】:

          解决方法可能是这样的:

          ---
          title: "Untitled"
          author: "Florian Privé"
          date: "12 septembre 2016"
          output: html_document
          ---
          
          ```{r}
          Rcpp::cppFunction('
          int fibonacci(const int x) {
              if (x == 0 || x == 1) return(x);
              return (fibonacci(x - 1)) + fibonacci(x - 2);
          }') 
          ```
          
          ```{r}
          fibonacci(10L)
          ```
          # [1] 55
          

          【讨论】:

          • 如果我们怀疑,他没有有效的 Rcpp 设置,那究竟是一种解决方法?
          • 我的机器上有一个正在运行的 Rcpp 设置,但无法运行此示例 github.com/yihui/knitr-examples/blob/master/029-engine-Rcpp.Rmd。所以我提出了上面的解决方法,因为这对我有用!不知道为什么,但这是事实。或许原海报也有同样的问题……
          • 这里有同样的错误。另一个可能有用的信息:我将 Rcpp 用于this in-progress packageCheck 正在“停止”,对示例进行无休止的检查。 Build &amp; Reload 给了我一个错误。但是如果我使用Check,在示例之前停止它,然后使用Build &amp; Reload,它可以工作。这个包建立在Travis-CI和win-builder上。不知道这个问题有没有关系,不然算了。
          • 我的错误与此类似。这是因为我在 knittr 选项中有cache = TRUE。显然 Rccp 函数不能很好地处理缓存。所以要修复它,我将cache = FALSE 放在定义 Rcpp 函数的代码块中。
          猜你喜欢
          • 2021-11-13
          • 1970-01-01
          • 2021-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-17
          • 2019-03-04
          相关资源
          最近更新 更多