我有以下代码:
#include <Rinternals.h>
#include <cmath>
extern "C" {
SEXP myChar(int x) {
/*PrintValue(nam);*/
SEXP colnames, result;
PROTECT(colnames = Rf_allocVector(STRSXP,2));
char buffer[20];
int n = sprintf(buffer,"%4.2f%%",2.5);
SET_STRING_ELT(colnames,0,mkChar(buffer));
n = sprintf(buffer,"%4.2f%c",5.0,0x25);
SET_STRING_ELT(colnames,1,mkChar(buffer));
PROTECT(result = Rf_allocVector(VECSXP, 2));
SEXP scol1 = PROTECT(allocVector(REALSXP,10));
SEXP scol2 = PROTECT(allocVector(REALSXP,10));
for (size_t k=0;k<10;++k){
REAL(scol1)[k] = std::pow(k,0.5);
REAL(scol2)[k] = std::pow(k,0.7);
}
SET_VECTOR_ELT(result,0,scol1);
SET_VECTOR_ELT(result,1,scol2);
setAttrib(result, R_NamesSymbol, colnames);
UNPROTECT(4);
return(result);
}
}
我这样编译:
R CMD SHLIB myChar.cpp
在我的R会话中运行以下内容:
> dyn.load("myChar.so")
> out<-as.data.frame(.Call("myChar"))
> out
X2.50. X5.00.
1 0.000000 0.000000
2 1.000000 1.000000
3 1.414214 1.624505
4 1.732051 2.157669
5 2.000000 2.639016
6 2.236068 3.085169
7 2.449490 3.505144
8 2.645751 3.904529
9 2.828427 4.287094
10 3.000000 4.655537
我的问题是为什么列名称不显示百分号?我使用&#39; %%&#39;为了逃避百分号,但在列名中它被转换为一个句号,即代替&#34; X2.50%&#34;我得到&#34; X2.50。&#34;。这是mkChar的一个功能吗?有没有其他方法将char数组转换为SEXP?
答案 0 :(得分:4)
您的C/C++
代码没有任何问题。当你强迫data.frame
时出现问题。试试这个:
out<-.Call("myChar")
#names are correct
names(out)
#[1] "2.50%" "5.00%"
#now correctly to data.frame, see ?data.frame
out<-data.frame(out,check.names=FALSE)
# 2.50% 5.00%
#1 0.000000 0.000000
#2 1.000000 1.000000
#3 1.414214 1.624505
#4 1.732051 2.157669
#5 2.000000 2.639016
#6 2.236068 3.085169
#7 2.449490 3.505144
#8 2.645751 3.904529
#9 2.828427 4.287094
#10 3.000000 4.655537
请参阅check.names
的{{1}}参数,以了解正在发生的事情。
答案 1 :(得分:0)
您可以尝试使用\045
来表示百分比符号。