使用 Rcpp 属性允许 C++ 常量作为默认函数参数

2023-12-10

我在 R 包中使用 rcpp 创建了一个 cumsum 函数,它将对向量进行累积求和,直到达到用户定义的上限或下限。然而,如果希望将累积和限制在上方,则用户仍必须指定下限。

Example:

a = c(1, 1, 1, 1, 1, 1, 1)

如果我想高潮a上限为 3,我可以cumsum_bounded(a, lower = 1, upper = 3)。我宁愿不必指定下限。

My code:

#include <Rcpp.h>
#include <float.h>
#include <cmath>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector cumsum_bounded(NumericVector x, int upper, int lower) {
  NumericVector res(x.size());
  double acc = 0;
  for (int i=0; i < x.size(); ++i) {
    acc += x[i];
    if (acc < lower)  acc = lower;
    else if (acc > upper)  acc = upper;
    res[i] = acc;
  }
  return res;
}

我想要什么:

#include <Rcpp.h>
#include <float.h>
#include <cmath>
#include <climits> //for LLONG_MIN and LLONG_MAX
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector cumsum_bounded(NumericVector x, long long int upper = LLONG_MAX, long long int lower = LLONG_MIN) {
  NumericVector res(x.size());
  double acc = 0;
  for (int i=0; i < x.size(); ++i) {
    acc += x[i];
    if (acc < lower)  acc = lower;
    else if (acc > upper)  acc = upper;
    res[i] = acc;
  }
  return res;
}

简而言之,是的,这是可能的,但它需要技巧,涉及创建中间函数或在主函数中嵌入排序逻辑。


总而言之,Rcpp属性只支持有限的特征值集。这些值列在Rcpp FAQ 3.12入口

  • 用引号分隔的字符串文字(例如“foo”)
  • 整数和小数数值(例如 10 或 4.5)
  • Pre-defined constants including:
    • 布尔值:真与假
    • 空值:R_NilValue、NA_STRING、NA_INTEGER、NA_REAL 和 NA_LOGICAL。
  • Selected vector types can be instantiated using the empty form of the ::create static member function.
    • 字符向量、整数向量和数字向量
  • Matrix types instantiated using the rows, cols constructor Rcpp::Matrix n(rows,cols)
    • 字符矩阵、整数矩阵和数字矩阵)

如果您要指定数值LLONG_MAX and LLONG_MIN这将满足在函数上直接使用 Rcpp 属性的标准。然而,这些值是特定于实现的。因此,对它们进行硬编码并不理想。因此,我们必须寻求外部解决方案:Rcpp::Nullable<T>类以启用默认值NULL价值。我们必须用以下内容包装参数类型的原因Rcpp::Nullable<T>就是它NULL是一个很特殊的东西,一不小心就会让人心痛。

The NULL与实数线上的其他值不同,在这种情况下,值不会用于限制您的值。因此,它是在函数调用上使用的完美候选者。然后您必须做出两个选择:使用Rcpp::Nullable<T>作为主函数上的参数,或者创建一个具有正确参数的“逻辑”辅助函数,并且可以放心地在应用程序中的其他地方使用。我选择了下面的后者。

#include <Rcpp.h>
#include <float.h>
#include <cmath>
#include <climits> //for LLONG_MIN and LLONG_MAX
using namespace Rcpp;

NumericVector cumsum_bounded_logic(NumericVector x,
                                   long long int upper = LLONG_MAX,
                                   long long int lower = LLONG_MIN) {

    NumericVector res(x.size());
    double acc = 0;
    for (int i=0; i < x.size(); ++i) {
        acc += x[i];
        if (acc < lower)  acc = lower;
        else if (acc > upper)  acc = upper;
        res[i] = acc;
    }

    return res;
}

// [[Rcpp::export]]
NumericVector cumsum_bounded(NumericVector x,
                             Rcpp::Nullable<long long int> upper = R_NilValue, 
                             Rcpp::Nullable<long long int> lower = R_NilValue) {

    if(upper.isNotNull() && lower.isNotNull()){
        return cumsum_bounded_logic(x, Rcpp::as< long long int >(upper), Rcpp::as< long long int >(lower));
    } else if(upper.isNull() && lower.isNotNull()){
        return cumsum_bounded_logic(x, LLONG_MAX, Rcpp::as< long long int >(lower));
    } else if(upper.isNotNull() && lower.isNull()) {
        return cumsum_bounded_logic(x, Rcpp::as< long long int >(upper), LLONG_MIN);
    } else {
        return cumsum_bounded_logic(x, LLONG_MAX, LLONG_MIN);
    }

    // Required to quiet compiler
    return x;
}

测试输出

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

使用 Rcpp 属性允许 C++ 常量作为默认函数参数 的相关文章

  • r : 直方图上的 ECDF

    在 R 中 与ecdf我可以绘制经验累积分布函数 plot ecdf mydata 与hist我可以绘制数据的直方图 hist mydata 如何在同一图中绘制直方图和 ecdf EDIT 我尝试做类似的东西 https mathemati
  • 计算级别内的值

    我在 R 中生成了一组级别cut 例如假设 0 到 1 之间的小数值 分为 0 1 个区间 gt frac lt cut c 0 1 breaks 10 gt levels frac 1 0 001 0 1 0 1 0 2 0 2 0 3
  • 根据值的运行总计创建组

    我的数据在一个变量 Y 上是唯一的 另一个变量 Z 告诉我每个 Y 中有多少人 我的问题是我想从这些 Y 和 Z 创建 45 人的组 我的意思是 每当运行总计Z 达到 45 创建一组 然后代码继续创建下一组 我的数据看起来像这样 ID X
  • 如何从 data.frame 中选择行和列的子集

    我有这个 d d Age gt 2 它返回 Age 超过 2 的所有行 但我只想返回几列中的值 例如 d X 和 d Y 而不是全部 无论如何我可以做到这一点吗 Thanks d d Age gt 2 c X Y
  • 在 R 中读取 Stata 13 文件

    有没有办法在 R 中读取 Stata 版本 13 数据集文件 我尝试执行以下操作 gt library foreign gt data read dta TEAdataSTATA dta 但是 我收到一个错误 read dta TEAdat
  • Quarto/Rmarkdown 中的美人鱼图:狭窄且模糊

    我正在尝试生成 pdf 格式的四开文档 稍后会生成 word 格式 我遇到了美人鱼图的问题 请在下面找到一个示例 qmd 文件来说明该问题 所以首先它应该支持 mermaid 标签 但当我这样做时 我无法在 rstudio 中 运行 单元
  • udunits2 R 安装:找不到 udunits2.h

    我正在尝试在 R 中安装 udunits2 以满足对ggforce包裹 但是 安装程序在检查 udunits2 时始终失败 我已经尝试过中的说明this https stackoverflow com questions 47059517
  • 解释 survreg 中的威布尔参数

    我正在尝试使用从 R 中的 survreg 估计的参数生成逆威布尔分布 我的意思是 对于给定的概率 这将是在 MS Excel 中实现的小型模拟模型中的随机数 返回使用我的参数预计出现故障 的时间 我理解逆威布尔分布的一般形式是 X b l
  • R:使用管道将单个参数传递到函数中的多个位置

    我试图专门使用管道来重写以下代码 使用babynames包中的babynames数据 library babynames library dplyr myDF lt babynames gt group by year gt summari
  • 当子集长度为零时,如何简洁地处理子集?

    从向量中排除元素x x lt c 1 4 3 2 我们可以减去位置向量 excl lt c 2 3 x excl 1 1 2 这也是动态工作的 excl lt which x which max x gt quantile x 25 1 2
  • 如何在multilist中设置xlim?

    以下代码创建 3 个向量 并将它们显示为交错直方图 a lt c 1 2 3 b lt c 1 1 2 c lt c 1 1 1 l lt list a b c multhist l col c red green blue xlim c
  • 分割单个 SpatialPolygons 对象的多边形部分

    在 R 中 我有一个SpatialPolygons包含数百个多边形的对象 即多个多边形 我想分割这个SpatialPolygons对象放入列表中Polygons 即孔应保持连接到父多边形 知道如何做到这一点吗 EDITED 使用以下提供的示
  • 如何优化 R 中的 sapply 来计算数据帧上的运行总计

    我在 R 中编写了一个函数来按月份计算累积总数 但随着数据集变大 我的方法的执行时间呈指数增长 我是一名 R 程序员新手 你能帮我提高效率吗 该函数以及我调用该函数的方式 accumulate lt function recordnum d
  • 在 R Shiny 中显示/隐藏整个框元素

    我目前正在尝试找到一种方法来隐藏 显示 R Shiny 中的整个 box 元素 以及里面的所有内容 我想创建一个可能的按钮 它允许用户展开特定框 然后使用相同 甚至不同 的按钮隐藏它 我不想使用条件面板 因为我的应用程序非常大并且会产生一些
  • 如何将 mcmc.list 转换为 bugs 对象?

    我正在使用rjagsR 库 功能coda samples产生一个mcmc list 例如 来自example coda samples library rjags data LINE LINE recompile LINE out lt c
  • 如何制作一连串的ggplots并在它们之间绘制箭头?

    对于一个项目 我需要绘制一些图并在它们之间放置箭头作为序列的指示 我想知道我是否可以用 ggplot 来做到这一点 是否可以使用 ggplot2 绘制一个干净的大箭头并将其添加到最终的多重图中 作为示例 我使用此代码来绘制绘图 librar
  • 求解非线性方程组

    我正在尝试求解以下四个方程组 我尝试过使用 rootSolve 包 但似乎我无法通过这种方式找到解决方案 我正在使用的代码如下 model lt function x F1 lt sqrt x 1 2 x 3 2 1 F2 lt sqrt
  • 替换rmarkdown/knitr/pdf中字幕的自动编号

    我正在使用 Rmarkdown 生成 PDF 文档 我想在其中手动定义图号 下面是一个块的示例 r chunk26 fig cap Fig 5 3 My figure caption plot 1 1 我使用特殊的编号来遵循文档的章节 问题
  • 使用插入符和方法 = gamLoess 进行训练时 R 崩溃

    当我运行下面的代码时 R 崩溃了 如果我在训练调用中注释掉tuneGrid行 就不会发生崩溃 我已经用另一个数据集尝试过此操作 但仍然使 R 崩溃 崩溃消息是 R 会话中止 R遇到致命错误 会话被终止 开始新会话 代码是 library s
  • R 在安装包依赖项时不考虑最大版本

    假设我正在开发一个名为magicr做一些统计魔术 我希望它使用另一个名为的包中的函数fairydust 假设 存在于 CRAN 上 很遗憾fairydust刚刚向 CRAN 发布了 2 0 0 版本 完全破坏了我计划使用的功能 所以我更新了

随机推荐

  • RecyclerView 单个项目 ID

    呃 我正在修改一个在互联网上找到的示例应用程序 学习2破解 我想获取 ReclycerView 中单行的 ID 这是代码 Main private void initViews RecyclerView recyclerView Recyc
  • Firebase 实时数据库能否有效循环数十亿条帖子并由发布帖子的用户检索它们?

    我正在使用 Firebase 实时数据库开发 iOS 应用程序 该应用程序可能会包含数十亿条帖子 其中包含大量图像和数据 需要根据特定用户关注的人 例如 Instagram 来检索这些图像和数据 我知道 Firebase 中的最佳实践是尽可
  • .htaccess 重定向到“https://www”

    我正在寻找一个 htaccess 配置 它将所有请求重定向到我的网站https www 那么用户是否访问 www example com http example com http www example com https example
  • 如何发出带有特定正文的 HTTP POST 请求?以及如何从服务器访问令牌以允许我登录?

    我有这样的场景 1 我想创建 Http POST 请求 为此我有数据 请参见此图片 2 正如您在上图中看到的 我必须使用上述正文创建发布请求 并且我还收到名为 token 的响应 如何创建发布请求并获取此令牌响应 3 该令牌响应将允许我登录
  • 定义/调用具有奇怪名称的对象?

    我正想问另一个问题 这个问题突然出现在我的脑海里 我们如何定义一个具有奇怪名称的对象 例如 假设我们想调用一个对象 test 如果我想定义它 我会使用 test lt 10 现在的问题是如何调用这个对象 如果我们再次使用 那么R会将其视为字
  • pycuda; nvcc 致命:找不到 Visual Studio 配置文件“(null)”

    我正在尝试奔跑pycuda入门教程安装 Visual C Express 2010 和各种 Nvidia 驱动程序 SDK 等后 我可以 mod SourceModule global void doublify float a int i
  • 理解构造函数调用模式中的“this”

    试图理解this 找到一个例子javascript the good parts book var first var second var Quo function string first this this status string
  • 从 XML 创建 RDF

    我有这个 xml 文件 如何使用 java 中的 xpath 和 ModelFactory 从它创建 RDF 三元组
  • 查询视图以获取其列名称

    我有大量的 SQL 2008 R2 视图 我想知道视图中引用了哪些数据库字段 有没有一种方法可以查询架构以列出这些列名称 使用此查询针对sys sql dependencies SELECT ViewName O name Referenc
  • 在指定行上方插入行

    我想知道如何在具有 订单类型 如下指定 的指定行上方插入 3 行额外的行 该行在工作表中多次出现 下面的代码可以工作 只是它会在指定行下方插入行 谢谢 Sub try Dim c As Range For Each c In Range A
  • 在 MYSQL 子查询中使用 LIMIT 关键字的替代方法

    我有一个包含以下列的表 TEST code ver VARCHAR suite VARCHAR date DATE 现在我想选择 10 行具有不同的 c 值ode ver code ver NOT LIKE DevBld sorted by
  • if 语句中的增量运算符如何工作?

    include
  • 如何在没有网络连接的情况下克隆git存储库

    基础设施 我有两台主机 A 和 B 我无法从 A 连接到 B 反之亦然 主机 A 和主机 B 之间没有可到达的主机 C 我可以双向发送电子邮件 允许添加文本附件 不允许使用其他附件 可能还有其他问题 我想将 git 存储库从主机 A 克隆到
  • Django admin - 覆盖已经注册的模型

    我需要覆盖django eav应用程序管理类 在eav admin py型号已注册 admin site register Value 我需要添加列表显示到这个模型 我知道修改已安装的应用程序代码是不好的做法 所以我需要覆盖它 但是 不知道
  • EF5 Code First 枚举和查找表

    我想定义一个供 EF5 使用的枚举以及相应的查找表 我知道 EF5 现在支持枚举 但开箱即用 它似乎只在对象级别支持此功能 并且默认情况下不会为这些查找值添加表 例如 我有一个 User 实体 public class User int I
  • 选择类别后勾选子类别

    我有一个过滤器框图标 单击时会打开一个包含类别和子类别的对话框 如下 在此处输入图像描述 1 1 我想这样做 以便当用户检查一个类别 在我的例子中是一个国家 时 所有子类别 在我的例子中是一个城市 都会自动检查 是的 从数据库搜索的角度来看
  • Primefaces 组件 CSS 定制

    正如我在 primefaces 文档中看到的那样 1 To change the font size of PrimeFaces components globally use the ui widget style class An ex
  • 如何缓存 Firebase 存储下载的图像

    我正在开发一个应用程序 我需要缓存图像 以便我可以在用户离线时检索它们 并且在用户关闭并重新打开应用程序后也应该可以访问它们 我需要类似的东西 FirebaseFirestoreSettings setPersistenceEnables
  • 配置更改后或启动这些操作的活动被破坏后,SQLite CRUD 操作的预期行为是什么?

    我正在重构我前段时间制作的一个应用程序 当时我刚刚迈入 Android 最简单的方法就是避免方向更改 对于几乎所有的 CRUD 操作 我都使用AsyncTask类 没有实现内容提供程序或使用片段 现在我做了一些改变 I use Fragme
  • 使用 Rcpp 属性允许 C++ 常量作为默认函数参数

    我在 R 包中使用 rcpp 创建了一个 cumsum 函数 它将对向量进行累积求和 直到达到用户定义的上限或下限 然而 如果希望将累积和限制在上方 则用户仍必须指定下限 Example a c 1 1 1 1 1 1 1 如果我想高潮a上