2014-06-19 57 views
3

我在使用knitr時很難獲得C++代碼(通過內聯包中的cxxfunction編寫)以很好地顯示。這裏有一個MWE:inline :: cxxfunction在knitr中顯示不好

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

當我編織這樣的代碼,它通過爲「\ n」替換所有新生產線重新格式化的身體參數,這使得它非常難以閱讀。有沒有解決這個問題的方法?

+2

您是否運行knitr的最新版本?因爲我無法重現問題。 –

+0

啊,是的,從1.5更新到1.6修復了這個問題(我更新了Rcpp,inline和RcppArmadillo,但忘記了knitr)!謝謝您的幫助! –

+0

正如[常問問題1](http://bit.ly/knitr-faq)所示,執行'update.packages()'來查看問題是否就此消失了:) –

回答

2

release notes of knitr 1.6中列出的主要變化是:默認塊選項tidy = TRUE更改爲FALSE。這就是爲什麼你的換行符不再轉向文字\nknitr 1.6。

3

那麼現在你有兩個原因切換到Rcpp屬性:首先,它更容易使用。其次,它呈現在knitr :)

下面的代碼應該做同樣的更好 - 不是如何屬性處理所有的轉換對您:

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

嘗試渲染,在knitr。

+0

嗯...當我編寫代碼時,我得到以下行: cppFunction(「double mytest(double x){\ n return x; \ n}」,depends =「RcppArmadillo」)。 cppFunction絕對是更好用,但! –

1

另一種選擇是使用RCPP發動機在knitr:

```{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()。唯一的缺點是編譯不會被緩存。