- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想为包中的函数提供C++接口(interface),该包使用std::pair
返回Rcpp::interface
。但是,编译器会引发大量错误,从以下内容开始:
.../Rcpp/include/Rcpp/internal/Exporter.h:31:31: error: no matching
function for call to ‘std::pair<int, int>::pair(SEXPREC*&)’
Exporter( SEXP x ) : t(x){}
#include <Rcpp.h>
#include <utility>
// [[Rcpp::interfaces(cpp)]]
// [[Rcpp::export]]
std::pair<int, int> bla()
{
return std::make_pair(1,1);
}
inline std::pair<int, int> bla() {
typedef SEXP(*Ptr_bla)();
static Ptr_bla p_bla = NULL;
if (p_bla == NULL) {
validateSignature("std::pair<int, int>(*bla)()");
p_bla = (Ptr_bla)R_GetCCallable("testinclude", "testinclude_bla");
}
RObject rcpp_result_gen;
{
RNGScope RCPP_rngScope_gen;
rcpp_result_gen = p_bla();
}
if (rcpp_result_gen.inherits("interrupted-error"))
throw Rcpp::internal::InterruptedException();
if (rcpp_result_gen.inherits("try-error"))
throw Rcpp::exception(as<std::string>(rcpp_result_gen).c_str());
return Rcpp::as<std::pair<int, int> >(rcpp_result_gen);
}
最佳答案
However, the compiler throws a shitload of errors, starting with:
.../Rcpp/include/Rcpp/internal/Exporter.h:31:31: error: no matching
function for call to ‘std::pair<int, int>::pair(SEXPREC*&)’
Exporter( SEXP x ) : t(x){}
// [[Rcpp::export]]
属性触发的,该属性(尝试)生成所需的样板代码来打开将
std::pair<int, int>
转换成R知道如何处理的东西(即某种
SEXP
)。
But I don't want to return it back to R at all [...]
std::pair<int, int>
的转换器函数-只需删除
// [[Rcpp::export]]
声明,即可解决上述错误消息。
I simply want to use some C++ functions in another package
// [[Rcpp::interfaces]]
属性。
# nathan@nathan-deb:/tmp$ tree hinterface/
# hinterface/
# ├── DESCRIPTION
# ├── inst
# │ └── include
# │ ├── hinterface
# │ │ └── hinterface.hpp
# │ └── hinterface.h
# ├── NAMESPACE
# ├── R
# └── src
# ├── hinterface.cpp
# ├── Makevars
# └── Makevars.win
inst/
和
inst/include/
,因为这会导致R在将包安装在用户计算机上时将头文件
hinterface.h
复制到
hinterface
库目录中。另外,我创建了
inst/include/hinterface/
和
hinterface.hpp
,其中包含实现:
#ifndef hinterface__hinterface__hpp
#define hinterface__hinterface__hpp
#include <Rcpp.h>
#include <utility>
namespace hinterface {
inline std::pair<int, int> bla()
{ return std::make_pair(1, 1); }
} // hinterface
#endif // hinterface__hinterface__hpp
hinterface.h
文件-客户端实际上将在其源代码中包括-包含以下内容:
#ifndef hinterface__hinterface__h
#define hinterface__hinterface__h
#include "hinterface/hinterface.hpp"
// possibly other
// header files
// to include
#endif // hinterface__hinterface__h
src/
目录中,创建一个
Makevars
和
Makevars.win
,每个包含
PKG_CPPFLAGS = -I../inst/include
#include "hinterface.h"
void noop() { return; }
hclient
包中,它将从
bla
包中调用
hinterface
,事情甚至更加简单:
# nathan@nathan-deb:/tmp$ tree hclient/
# hclient/
# ├── DESCRIPTION
# ├── NAMESPACE
# ├── R
# └── src
# ├── hclient.cpp
Rcpp::Rcpp.package.skeleton
从R生成的),将
hinterface
添加到
LinkingTo
文件中的
DESCRIPTION
字段中,
LinkingTo: Rcpp,
hinterface
// [[Rcpp::depends(hinterface)]]
属性的调用,并包括
hinterface.h
:
// hclient.cpp
// [[Rcpp::depends(hinterface)]]
#include <Rcpp.h>
#include <hinterface.h>
// [[Rcpp::export]]
void call_bla()
{
std::pair<int, int> x = hinterface::bla();
std::printf(
"x.first = %d\nx.second = %d\n",
x.first, x.second
);
}
hclient::call_bla()
# x.first = 1
# x.second = 1
interface
的布局如下:
# nathan@nathan-deb:/tmp$ tree interface/
# interface/
# ├── DESCRIPTION
# ├── inst
# │ └── include
# │ └── interface.h
# ├── NAMESPACE
# ├── R
# │ └── libpath.R
# └── src
# ├── bla.cpp
# ├── Makevars
# └── Makevars.win
bla
或
*.hpp
文件中实现
*.h
,因此接口(interface)头
interface.h
将仅包含函数原型(prototype):
#ifndef interface__interface__h
#define interface__interface__h
#include <Rcpp.h>
#include <utility>
namespace interface {
std::pair<int, int> bla();
} // interface
#endif // interface__interface__h
Makevars
和
Makevars.win
仅包含
PKG_CPPFLAGS = -I../inst/include
(以及其他可能需要设置的标志)。
bla.cpp
非常简单,仅包含适当的实现:
#include "interface.h"
namespace interface {
std::pair<int, int> bla()
{ return std::make_pair(1, 1); }
} // interface
interface
才能实际使用
bla()
,并且通过链接到我并不意味着仅将
interface
添加到
LinkingTo
文件中的
DESCRIPTION
字段中,具有讽刺意味的是与之无关编译中的链接阶段。未能做到这一点-例如仅包含 header
interface.h
-将导致
R CMD INSTALL
暂停,因为它在尝试加载客户端软件包时将找不到合适的符号。对于用户来说,这可能是一个非常令人沮丧的错误。幸运的是,您可以通过提供类似于以下功能的东西来简化事情,该函数生成
interface
共享库的位置:
# libpath.R
.libpath <- function() {
cat(sprintf(
"%s/interface/libs/interface%s",
installed.packages()["interface","LibPath"][1],
.Platform$dynlib.ext
))
}
.
开头命名该名称,这样它就不会被导出(默认情况下),因此不需要进行记录。如果您打算让人们在自己的程序包中使用C++接口(interface),则应导出该函数并适当地记录下来,以便他们了解如何使用它。它返回的路径将完全取决于(必要时)从其调用的特定R安装,但是在我的Linux机器上,它看起来像这样:
interface:::.libpath()
# /home/nathan/R/x86_64-pc-linux-gnu-library/3.4/interface/libs/interface.so
client
包,
# nathan@nathan-deb:/tmp$ tree client/
# client/
# ├── DESCRIPTION
# ├── NAMESPACE
# ├── R
# └── src
# ├── client.cpp
# ├── Makevars
# ├── Makevars.win
DESCRIPTION
文件再次需要
LinkingTo: Rcpp,
interface
client.cpp
如下所示:
// [[Rcpp::depends(interface)]]
#include <Rcpp.h>
#include <interface.h>
// [[Rcpp::export]]
void call_bla()
{
std::pair<int, int> x = interface::bla();
std::printf(
"x.first = %d\nx.second = %d\n",
x.first, x.second
);
}
hclient
包中的源文件没有什么不同。有趣的地方是
Makevars
和
Makevars.win
,它们现在包含
PKG_LIBS += `${R_HOME}/bin/Rscript -e "cat(interface:::.libpath())"`
interface
包中定义的帮助器函数来确保链接器可以使用适当的符号。构建它并从R中进行测试,
client::call_bla()
# x.first = 1
# x.second = 1
关于c++ - 具有Rcpp::interfaces的C++接口(interface)不适用于返回std::pair的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42261822/
我想将函数参数中的默认值设置为 Rcpp::Function 参数。 只是简单的赋值,Rcpp::Function func = mean , 不可能。它返回错误:no viable conversi
我正在处理需要逐元素矩阵乘法的代码。我试图在 Rcpp 中实现这一点,因为代码需要一些昂贵的循环。我对 Rcpp 还很陌生,可能会遗漏一些东西,但我无法使逐元素矩阵乘法工作。 // [[Rcpp::e
在 C++ 中,我们可以声明一个变量作为引用。 int a = 10; int& b = a; 如果我们设置 b=15 , a 也会改变。 我想在 Rcpp 中做类似的事情。 List X = obj
我正在阅读很棒的 Rcpp vignette关于使用 Rcpp 模块公开 C++ 类和函数。在这种情况下,是否可以创建一个 Rcpp 函数,该函数具有一个类型为 Uniform 的类作为参数之一,并且
我在 R 中有一个命名列表: l = list(a=1, b=2) 我想在 Rcpp 中使用这个列表,并迭代值和名称。理想情况下,它可能类似于(为简洁起见使用 C++11 格式): void prin
这个问题在这里已经有了答案: Rcpp - sourceCpp - undefined symbol (2 个答案) 关闭 4 年前。 我现有的 C 代码由三个文件组成:头文件(“.h”文件)、库文
我目前正在为类作业编写模拟退火算法(“解决”背包问题),并想在 Rcpp 中完成(我必须使用 R,而 Rcpp 更快)。 Rcpp 一直给我以下错误 invalid static_cast from
根据我的理解,在 Rcpp 和 C++ 之间转换 vector 会创建新 vector ,如下所示。我的理解对吗? 将 Rcpp vector 转换为 C++ vector 时,我们使用 Rcpp::
我想将参数的默认值设置为 NULL在Rcpp如果参数不是NULL,则函数并根据参数进行一些计算.这种代码的一个例子是 #include using namespace Rcpp; // [[Rcpp
任何人都可以解释以下行为吗? 当声明一个新的NumericMatrix时,y,作为原始矩阵,x,乘以一个标量,c,标量/矩阵乘法的顺序很重要。如果我将左侧的标量与右侧的矩阵相乘(例如 NumericM
有一种方法可以使用 NA 值初始化数值向量,例如。 NumericVector x(10,NumericVector::get_na()) 有没有类似的方法可以将矩阵初始化为 NA 值? 最佳答案 这
这可能是一个非常简单的问题,但我不知道哪里出了问题。 我有一个传递给 Rcpp 函数的列表,该列表的第一个元素是一个 data.frame。 我如何获取该 data.frame? bar = list
我正在尝试开发一个使用 Sundials 的 R 包用于求解微分方程的 C 库。为了不让用户安装库,我将库的源代码放在我的包中。 我已将库中的所有头文件放入 /inst/include/sundial
我正在研究一个同时使用 Rcpp::IntegerVector (行/列指针)和模板化 std::vector 的 Rcpp 稀疏矩阵类。基本原理是,在极大的稀疏矩阵中深度复制整数指针 vector
我想将一个R函数翻译成Rcpp,一个简单的测试代码如下,但我不知道如何处理默认设置为NULL的参数。 test t=R_NilValue, Rcpp
我想将一个R函数翻译成Rcpp,一个简单的测试代码如下,但我不知道如何处理默认设置为NULL的参数。 test t=R_NilValue, Rcpp
我想公开一个 C++ 类和一个将该类的对象作为 R 参数的函数。我必须遵循简化的示例。我使用创建了一个包 Rscript -e 'Rcpp::Rcpp.package.skeleton("soq")'
我想用 Rcpp 编写一个 C++ 函数,它使用 hypred 包中的 C 函数,它在 CRAN here 上. 我读了using C function from other package in R
[我在别处将其草拟为评论,但决定创建一个适当的问题...] 在 Rcpp 中使用数据帧时,就代码结构而言,目前被认为是“最佳实践”的是什么?从 R 到 C++ 代码的输入数据帧“传输”非常容易,但是如
我正在尝试使用 Rcpp::CharacterMatrix 并将每一行转换为 Rcpp::List 中它自己的元素。 但是,我为此编写的函数有一个奇怪的行为,即列表的每个条目都对应于矩阵的最后一行。为
我是一名优秀的程序员,十分优秀!