[ESS] ESS with inline package (for R) and indenting C/C++ code
Rodney Sparapani
rsparapa at mcw.edu
Fri Nov 2 18:13:51 CET 2012
On 11/02/2012 09:55 AM, Ramon Diaz-Uriarte wrote:
> Dear All,
>
> I am using the inline package for R, and I'd like indentation to magically
> work on C/C++ code fragments.
>
> For example, if I type by hand the following fragment (from question 2.2
> in the Rccp-FAQ.Rnw file, by Eddelbuettel and François)
>
>
> fx<- cxxfunction(signature( x = "numeric" ),
> 'NumericVector xx(x);
> return wrap( std::accumulate( xx.begin(), xx.end(), 0.0));',
> plugin = "Rcpp")
>
>
> the body of the C++ code itself is not indented automagically, and when
> typing the second line, I am taken to column 0 (and tab will do
> nothing). Is it possible to avoid having to manually enter whitespace?
>
>
> Thanks,
>
> R.
It's pretty much hopeless within a single .R file. I suppose that
you could consider something like mmm-mode. What I do is I put my
C++ code in .hxx and .cxx files so that they render correctly.
And then I "source" it via...
cat.file <- function(file) {
# cat.file returns the contents of a file as a string
content <- NULL
f1 <- file.info(file)
if(!is.na(f1$size) & !f1$isdir & f1$size>0) {
f1 <- file(file, open="r")
if(isOpen(f1)) {
content <- readLines(f1)
close(f1)
}
}
return(cat.char(content))
}
cat.char <- function(char) {
# arrays of strings are very annoying
# cat.char converts an array of strings into one long string with
line-feeds
cum <- NULL
for(i in 1:length(char)) {
if(i==1) cum <- sprintf("%s\n", char[1])
else cum <- sprintf("%s%s\n", cum, char[i])
}
return(cum)
}
So, I end up with something like:
fx <- cxxfunction(signature( x = "numeric" ),
includes=cat.file.R("fx.hxx"),
body=cat.file.R("fx.cxx"),
plugin = "Rcpp")
--
Rodney Sparapani, PhD Center for Patient Care and Outcomes Research
Sr. Biostatistician http://www.mcw.edu/pcor
4 wheels good, 2 wheels better! Medical College of Wisconsin (MCW)
WWLD?: What Would Lombardi Do? Milwaukee, WI, USA
More information about the ESS-help
mailing list