从 R 到 C 处理列表并访问它

2024-05-14

我想使用从 R 获得的 C 列表。我意识到这个问题与此非常相似:使用 .call() 在 R 和 C 之间传递数据帧 https://stackoverflow.com/questions/6658168/passing-a-data-frame-from-to-r-and-c-using-call。 但是,我无法将其存储在指针“*target”中,我将在其中进一步使用它。

R:

.Call("processlist", list(c(1,2), c(1,3,2), c(1,5,4,4)))

在C中:

#include <Rinternals.h>
#include <Rdefines.h>

extern "C" {
     SEXP processlist(SEXP lst);
}

SEXP processlist(SEXP lst){
   SEXP vec  = PROTECT(allocVector(VECSXP, 2));
   SET_VECTOR_ELT(vec, 0, VECTOR_ELT(c, 0);
   SET_VECTOR_ELT(vec, 1, VECTOR_ELT(c, 1);
   SET_VECTOR_ELT(vec, 2, VECTOR_ELT(c, 2);

   const lngth = 3;
   int *target[lnght];

   // Here i want to fill "target", but how?
   int *preTarget = INTEGER(vec);

   // Bad attempts
   target[0] = INTEGER(preTarget[0]);
   target[0] = INTEGER(vec[0]);
}

注意:不幸的是,C++ 不是一个选项。

编辑:所需的输出是我可以通过以下方式调用 *target 。

target[0][0] --> Returns: 1
target[1][2] --> Returns: 2
target[2][3] --> Returns: 4

以这种方式调用“vec”此时会引发错误。


在我看来,您只想从 C 端访问列表中的值。如果这是正确的,请查看下面的代码。

In 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,l = length(lst);
   /* You need an array of arrays, so target will be an int** */ 
   int **target = malloc(sizeof(int *)*l);
   for (i=0;i<l;i++) {
     target[i] = INTEGER(VECTOR_ELT(lst,i));
   }
   printf("target[0][0]: %d\n",target[0][0]);
   printf("target[1][2]: %d\n",target[1][2]);
   printf("target[2][3]: %d\n",target[2][3]);
   free(target);
   return R_NilValue;
}

需要注意的重要一点是target必须是一个int**,因为它是一个指向指针数组的指针。

In d.R (after d.c已编译):

dyn.load("d.so")
mylist<-list(c(1,2), c(1,3,2), c(1,5,4,4))
#This is very important: by default 1 in R is double. 
#You need to coerce every element of the list to integer.
mylist<-lapply(mylist,as.integer)
.Call("processlist", mylist)

请注意,我们需要将列表中的每个元素强制为整数。上面的结果是:

target[0][0]: 1
target[1][2]: 2
target[2][3]: 4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 R 到 C 处理列表并访问它 的相关文章

  • std::map find 在 C++ 中不起作用[重复]

    这个问题在这里已经有答案了 我使用以下几行创建了一个哈希映射和一个迭代器 std map
  • C++ STL 映射,std::pair 作为键

    这就是我通过地图定义的方式 std map
  • StackExchange Redis 删除所有以以下开头的键

    我有一个格式的密钥 Error 1 Error 24 Error 32 Using StackExchange Redis 我该怎么办KeyDelete在与格式匹配的所有键上Error 在另一个答案中我看到了 LUA 脚本 EVAL ret
  • 地图类容器的专用功能

    我想要专门为矢量和地图之类的容器设计一个函数模板 对于向量 我可以像下面那样做 但我不知道如何才能有一个专门版本的函数 该函数仅用于像地图这样的容器 include
  • 处理器关联组 C#

    我使用的是 72 核的 Windows Server 2016 我看到有两组处理器 我的 net 应用程序将使用一个或其他组 我需要能够强制我的应用程序使用我选择的组 我看到下面的代码示例 但我无法使其工作 我可能传递了错误的变量 我希望应
  • 字符串/分段错误

    Program to calculate trip and plan flights define TRIP 6 define NAMEMAX 40 define DEST 1 include
  • 如何在 ASP.NET MVC 中处理会话数据

    假设我想存储一个名为language id在会议中 我想我也许可以做如下的事情 public class CountryController Controller WebMethod EnableSession true AcceptVer
  • 使用 R 交互式更改 Plotly 图像中的轴刻度(线性/对数)

    Goal 创建交互式下拉菜单 按钮来更新 R 中 Plotly 图形的轴比例 Issue 有很多关于创建的文档buttons https plot ly r custom buttons and 对数图 https plot ly r lo
  • 图片框、双击和单击事件

    我有一个奇怪的问题 我有一个图片框双击事件以及单击事件 问题是即使我双击该控件 也会引发单击事件 如果我禁用单击事件 则双击事件正在工作 这个问题已经在这里讨论过 https stackoverflow com questions 1830
  • 在编译输出中添加程序集绑定 (app.config)

    如果我编译应用程序 则会在输出中自动添加程序集绑定 具体的程序集绑定不在app config在 Visual Studio 中但在创建的应用程序配置中 有什么办法可以检查为什么会自动添加程序集绑定吗 选项AutoGenerateBindin
  • 在 Ubuntu Lucid 中从二进制安装 R 包

    我已经使用以下命令在 Ubuntu Lucid 中安装了 R sudo aptitude 安装 r base 当我尝试 install packages 时 它似乎会下载源代码 然后花费很长时间来编译它 我怎样才能像我在 Windows 上
  • 将 JavaScript 引擎嵌入到 .NET 中 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 只是想知道是否有人尝试过将任何 js 引擎嵌入并实际集成到 net 环境中 我可以找到并实际使用 经过L
  • 现代编译器的 C++ 中“memset”功能的状态

    Context 不久前 我偶然发现了 Alexandrescu 在 2001 年发表的 DDJ 文章 http www ddj com cpp 184403799 http www ddj com cpp 184403799 它是关于比较将
  • 对象变空似乎是 Hangfire 中的反序列化问题

    Hangfire 似乎无法反序列化我的原始版本Scheduler对象及其所有状态 我正在调用其 Execute 方法BackgroundJob Enqueue 如下所示 Scheduler new FileInFileOut FileIn
  • 对列表中的一系列整数求和

    假设我有一个这样的列表 List
  • TCP/IP 传输期间套接字数据损坏

    当我通过预连接的 TCP IP 套接字发送数据时 我发现数据已损坏 Example Station1 正在向 Station2 发送数据 我已经在发送之前 在 S1 和接收之后 在 S2 打印了数据 以下是消息 S1 发送的数据是ACKS2
  • C# 中的 mshtml.HTMLDocumentClass

    在 C 中 我设法从 InternetExplorer 对象获取整个 HTMLDocumentClass 导航到某个 URL 然而 在 Visual Studio 2008 的调试模式下 该特定 URL 的 HTMLDocumentClas
  • C# 使用 .Equals() 比较两个 double

    我使用 ReShaper 当我用 比较两个双精度值时 它建议我应该使用 Math 具有公差的 ABS 方法 看 https www jetbrains com help resharper 2016 2 CompareOfFloatsByE
  • 在派生类中访问基类变量

    class Program static void Main string args baseClass obj new baseClass obj intF 5 obj intS 4 child obj1 new child Consol
  • 获取线段上最接近另一个点的点[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想找到线段AB上最接近另一个点P的点 我的想法是 Get a1 and b1由直线公式y1 a1x b1 使用 A 点

随机推荐