inline :: cxxfunction在knitr中表现不佳

时间:2014-06-19 16:49:51

标签: r inline knitr rcpp

我在使用knitr时很难显示C ++代码(通过内联包中的cxx函数编写)。这是一个MWE:

<html>
<body>

<!--begin.rcode
library(Rcpp)
library(inline)
test <- cxxfunction(signature(xR="numeric"), body="
  double x = as<double>(xR);
  return(wrap(x));
  ", plugin="RcppArmadillo")
end.rcode-->

</body>
</html>

当我编写这段代码时,它通过用&#34; \ n&#34;替换所有新行来重新格式化body参数。这让人很难阅读。有什么解决办法吗?

3 个答案:

答案 0 :(得分:3)

现在你有两个理由切换到Rcpp属性:首先,它更容易使用。其次,它在knitr中呈现得更好:)

以下代码应该这样做 - 而不是Attributes如何为您处理所有转换:

library(Rcpp)
library(inline)
cppfunction('double mytest(double x) {
  return x;
}', depends="RcppArmadillo")

尝试在knitr中渲染。

答案 1 :(得分:2)

release notes of knitr 1.6中列出了重大更改:默认的块选项tidy = TRUE已更改为FALSE。这就是为什么您的换行符不再使用 knitr 1.6转换为文字\n

答案 2 :(得分:1)

另一种选择是在knitr中使用Rcpp引擎:

```{r, engine = "Rcpp"}
#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double meanC(NumericVector x) {
  int n = x.size();
  double total = 0;

  for(int i = 0; i < n; ++i) {
    total += x[i];
  }
  return total / n;
}
```

该块将语法突出显示为C ++,并且该函数将可用于cppFunction()的其他块。唯一的缺点是编译没有缓存。