mkChar没有逃脱百分号

时间:2015-12-12 08:00:41

标签: c++ r

我有以下代码:

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

2 个答案:

答案 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来表示百分比符号。