【问题标题】:Rcpp error: static assertion failed: cannot convert type to SEXP, why?Rcpp 错误:静态断言失败:无法将类型转换为 SEXP,为什么?
【发布时间】:2020-02-01 06:18:42
【问题描述】:

错误

我不明白为什么我在使用 Rcpp(版本 1.0.2)时会出现此编译错误:

来自文件/home/rmagno/R/x86_64-pc-linux-gnu-library/3.6/Rcpp/include/Rcpp/internal/wrap.h

Line 523 static assertion failed: cannot convert type to SEXP

错误来源

我正在尝试从 GLFW 库中包装这个 C 函数 glfwSetKeyCallback

而且我知道该错误以某种方式源于下面的 CPP 源文件,但我不明白我做错了什么:

glfw_types.h

#ifndef RCPP_GLFW_TYPES_H
#define RCPP_GLFW_TYPES_H

#include <Rcpp.h>
#include <GLFW/glfw3.h>

// https://stackoverflow.com/questions/41210595/s4-object-with-a-pointer-to-a-c-struct

typedef Rcpp::XPtr<GLFWwindow, Rcpp::PreserveStorage, glfwDestroyWindow> GLFWwindow_ptr;

#endif

glfw_set_key_callback.cpp

#include "glfw_types.h"
using namespace Rcpp;

namespace {
  std::unique_ptr<Rcpp::Function> key_callback_func_ptr;
}

void glfw_set_key_callback_wrapper(GLFWwindow* window, int key, int scancode, int action, int modes)
{
  (*key_callback_func_ptr)(window, key, scancode, action, modes);
}

// [[Rcpp::export]]
void glfw_set_key_callback(GLFWwindow_ptr window, Rcpp::Function key_callback) {

  key_callback_func_ptr = std::make_unique<Rcpp::Function>(key_callback);
  glfwSetKeyCallback((GLFWwindow*)window, (GLFWkeyfun) glfw_set_key_callback_wrapper);

}

编辑

下面的源代码编译函数 glfw_destroy_window 并将其导出为 glfwDestroyWindow 使用类型 GLFWwindow_ptr 并在 R 中编译和工作正常。

glfwDestroyWindow.cpp

#include "glfw_types.h"
using namespace Rcpp;

//' @export
// [[Rcpp::export("glfwDestroyWindow")]]
void glfw_destroy_window(GLFWwindow_ptr window) {
  glfwDestroyWindow((GLFWwindow*)window);
  R_ClearExternalPtr(window);
}

编辑 2

这个功能也很好用:

#include "glfw_types.h"
using namespace Rcpp;

//' @export
// [[Rcpp::export("glfwCreateWindow")]]
GLFWwindow_ptr glfw_create_window(int width, int height, std::string title) {
  const char *title_c = title.c_str();
  return GLFWwindow_ptr(glfwCreateWindow(width, height, title_c, NULL, NULL), true);
}

编辑 3

这似乎工作......

新的 glfw_set_key_callback.cpp

#include "glfw_types.h"
using namespace Rcpp;

namespace {
  std::unique_ptr<Rcpp::Function> key_callback_func_ptr;
}

void glfw_set_key_callback_wrapper(GLFWwindow* window, int key, int scancode, int action, int modes)
{
  (*key_callback_func_ptr)(GLFWwindow_ptr(window, true), key, scancode, action, modes);
}

// [[Rcpp::export]]
void glfw_set_key_callback(GLFWwindow_ptr window, Rcpp::Function key_callback) {

  key_callback_func_ptr = std::make_unique<Rcpp::Function>(key_callback);
  glfwSetKeyCallback((GLFWwindow*)window, (GLFWkeyfun) glfw_set_key_callback_wrapper);

}

非常感谢任何帮助!

【问题讨论】:

  • 我的快速猜测是 Rcpp 告诉你 GLFWwindow_ptr 不是它可以为你翻译的类型。
  • 但是我在头文件中有那个typedef。
  • 我想我在五天前对您的第一个问题提出了建议,您正在执行一项涉及到一定程度的任务并且需要研究可用的文档,例如在我们的小插图中。我只能重复这一点并补充:研究一些这样做的包。它需要(很多)超过typedef
  • 恕我直言@Dirk,我第一次收到你的消息,但我觉得这不公平。我读过你所有的小插曲,我看过你谈论 Rcpp 的 youtube 视频。我使用 Rcpp 查看了 github 上的许多包。现在,关于这个主题,我有另一个函数glfw_destroy_window 成功使用GLFWwindow_ptr。我也会发布它,以防它有助于澄清我的观点。
  • 您的最终编辑是否意味着您的问题已解决?那么将其发布为(自我)答案是有意义的。

标签: r rcpp


【解决方案1】:
#include "glfw_types.h"
using namespace Rcpp;

namespace {
  std::unique_ptr<Rcpp::Function> key_callback_func_ptr;
}

void glfw_set_key_callback_wrapper(GLFWwindow* window, int key, int scancode, int action, int modes)
{
  (*key_callback_func_ptr)(GLFWwindow_ptr(window, false), key, scancode, action, modes);
}

// [[Rcpp::export]]
void glfw_set_key_callback(GLFWwindow_ptr window, Rcpp::Function key_callback) {

  key_callback_func_ptr = std::make_unique<Rcpp::Function>(key_callback);
  glfwSetKeyCallback((GLFWwindow*)window, (GLFWkeyfun) glfw_set_key_callback_wrapper);

}

【讨论】:

    猜你喜欢
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2018-08-09
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多