C++ 如何从C代码中获取R列表列名
我需要编写一个C/C++函数来检索R列表列名 从R开始,我想做以下工作C++ 如何从C代码中获取R列表列名,c++,r,C++,R,我需要编写一个C/C++函数来检索R列表列名 从R开始,我想做以下工作 > dyn.load("R_list.dll") > x = list(param1="value1", param2="value2", param3="value3") > .Call("func", x) 作为一个输出,我想看到“param1”“param2”“param3”与名称(x)函数从R >名称(x) [1] “param1”“param2”“param3” 在我的cpp文件中,我有以下内容
> dyn.load("R_list.dll")
> x = list(param1="value1", param2="value2", param3="value3")
> .Call("func", x)
作为一个输出,我想看到“param1”“param2”“param3”
与名称(x)
函数从R
>名称(x)
[1] “param1”“param2”“param3”
在我的cpp文件中,我有以下内容
#include <R.h>
#include <Rinternals.h>
#include <Rdefines.h>
extern "C" __declspec( dllexport ) SEXP func(SEXP list)
{
try
{
if (isNewList(list))
{
int n = length(list);
printf("%d\n", n);
for (int i=0; i<n; ++i)
printf("%s\n", CHAR(STRING_ELT(VECTOR_ELT(list, i), 0)));
}
else
{
throw std::exception("'list' variable must be a list!");
}
}
catch(const std::exception& ex)
{
printf("Exception was thrown: %s\n", ex.what());
}
return R_NilValue;
}
#包括
#包括
#包括
外部“C”uu declspec(dllexport)SEXP func(SEXP列表)
{
尝试
{
if(isNewList(list))
{
int n=长度(列表);
printf(“%d\n”,n);
对于(int i=0;i它都在Rf_getAttrib
,R_NamesSymbol
,请参阅:
library('inline')
listnamesattr
成员函数也可以用于此(尽管@gagolews的答案显然更简单):
require(内联)
l甚至更短——作为Rcpp的一条语句负责所有转换
首次加载Rcpp:
R> library(Rcpp)
创建我们的单语句函数
R> cppFunction('CharacterVector mynames(List l) { return l.attr("names"); }')
并测试它:
R> mynames(list(a=1:3, b=runif(10), c=LETTERS))
[1] "a" "b" "c"
R>
编辑:正如罗曼提醒我的,一个更短的变体是使用names()
:
除非您的列表是data.frame(而不是),否则您可能在查找元素名,而不是列名。非常感谢!这就是我需要的。您可以将其简化为一条语句。您甚至可以执行l.names()
操作。
R> cppFunction('CharacterVector mynames(List l) { return l.attr("names"); }')
R> mynames(list(a=1:3, b=runif(10), c=LETTERS))
[1] "a" "b" "c"
R>
R> cppFunction('CharacterVector mynames(List l) { return l.names(); }')
R> mynames(list(a=1:3, b=runif(10), c=LETTERS))
[1] "a" "b" "c"
R>