C++ 如何从C代码中获取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文件中,我有以下内容

我需要编写一个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文件中,我有以下内容

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