gpt4 book ai didi

c - 处理从 R 到 C 的字符串列表

转载 作者:行者123 更新时间:2023-12-01 13:20:29 26 4
gpt4 key购买 nike

这个问题与我的另一个问题有关:Process list from R to C and access it .我想处理一个字符串列表:<-list(c("ab", "ac"), c("ab", "zd", "fd"), c("de", "re", "te", "zz")) .

我努力处理字符串而不是整数。我知道如何声明一个字符串:

char string[] = "example";

但我显然还需要学习很多东西来处理数据——我的尝试:

char stor[] = CHAR(VECTOR_ELT(lst, i));
// and then store in in a list --> target[i] = stor;

C 代码 - d.c :

/* Including some headers to show the results*/
#include <Rinternals.h>
#include <Rdefines.h>
#include <R.h>
#include <stdlib.h>
#include <stdio.h>
SEXP processlist(SEXP lst){
int i;
int len = length(lst);

char **target = malloc(sizeof(char *)*len);
for (i = 0;i < l; i++) {
// use char stor[] to store string instead of Array!?
char stor[] = CHAR(VECTOR_ELT(lst, i));
// would i have to modify target[] too?
target[i] = stor;
}
printf("target[0]: %s\n",target[0]);
printf("target[1]: %s\n",target[1]);
printf("target[2]: %s\n",target[2]);
free(target);
return R_NilValue;
}

等同于其他职位:d.R (编译 d.c 之后):

dyn.load("d.so")
mylist<-list(c("ab", "ac"), c("ab", "zd", "fd"), c("de", "re", "te", "zz"))
# should be character already? to be sure,...
mylist<-lapply(mylist,as.character)
.Call("processlist", mylist)

最佳答案

扩展我的评论:内容指向 R 列表内容的 C 变量必须是 char *** 类型,因为字符串是 char * 并且字符串的 vectorchar **。假设 target 是那个变量。 target[i] 指向列表的第i个 vector ; target[i][j] 是第 i 个 vector 的第 j 个字符串。 target[i][j][k] 是第 i 个 vector 的第 j 个字符串的第 k 个字符。您需要将外部target分配给R列表的长度;那么你需要将每个 target[i] 分配为与它们指向的相应 vector 一样长。如果要复制 R 列表的内容,可以选择将每个 target[i][j] 分配给相应字符串的长度(字符数)。否则,您只需将相应的 CHAR(STRING_ELT(VECTOR_ELT(lst,i),j)) 分配给 target[i][j]

希望此时您应该能够自己完成任务。但是,这是一个工作代码:

#include <Rinternals.h>
#include <Rdefines.h>
#include <R.h>
#include <stdlib.h>
#include <stdio.h>
SEXP processlist(SEXP lst){
int i,j,elLength;
int len = length(lst);
SEXP tmp;
char ***target = malloc(sizeof(char **)*len);
for (i = 0;i < len; i++) {
tmp = VECTOR_ELT(lst,i);
elLength = length(tmp);
target[i] = malloc(sizeof(char *) * elLength);
for (j=0;j<elLength;j++) {
target[i][j] = CHAR(STRING_ELT(tmp,j));
}
}
printf("target[0][0]: %s\n",target[0][0]);
printf("target[1][1]: %s\n",target[1][1]);
printf("target[2][2]: %s\n",target[2][2]);
for (i=0;i<len;i++)
free(target[i]);
free(target);
return R_NilValue;
}

关于c - 处理从 R 到 C 的字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50231159/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com