与R固有的矢量化性质有关的一个很好的特征是第2.2节An Introduction to R中描述的循环规则.

发生在同一表达式中的向量不一定都具有相同的长度.如果不是,则表达式的值是一个向量,其长度与表达式中出现的最长向量相同.表达式中较短的向量的频率为recycled,直到它们与最长向量的长度匹配为止.特别是一个常数只是简单地重复.

大多数标准函数都使用它,但这样做的代码隐藏在底层C代码中.

有没有一种规范的方法可以完全在R代码中实现函数的标准回收规则?也就是说,给定一个函数

mock <- function(a, b, c) {
    # turn a, b, and c into appropriate recycled versions

    # do something with recycled a, b, and c in some appropriately vectorized way
}

如果abc是向量,可能具有不同的长度和未知的类型/类别,那么有没有一种规范的方法来获得根据标准回收规则回收的一组新向量?特别是,我不能假设"做点什么"这一步本身就能实现正确的回收,所以我需要事先自己做.

推荐答案

我以前用过这个,

expand_args <- function(...){
  dots <- list(...)
  max_length <- max(sapply(dots, length))
  lapply(dots, rep, length.out = max_length)
}

R相关问答推荐

为什么predicate.lm给出的是一个长度与我解析的数据集不同的载体?

使用gsim删除特殊词

手工PCA上的载体与输出双图不匹配

R:如何自动化变量创建过程,其中我需要基于ifelse()为现有变量的每个级别创建一个单独的变量

为什么stat_bin在R中的ggplot中显示错误的数字?

创建重复删除的唯一数据集组合列表

在ggplot的注释表格中突出显示最大值

如何使用R Shiny中的条件面板仅隐藏和显示用户输入,同时仍允许运行基础计算?

从R导出全局环境中的所有sf(numrames)对象

根据多个条件增加y轴高度以适应geom_text标签

将饼图插入条形图

如何使用ggplot对堆叠条形图进行嵌套排序?

以相同的方式对每个表进行排序

如何将使用rhandsontable呈现的表值格式化为百分比,同时保留并显示完整的小数精度?

函数可以跨多个列搜索多个字符串并创建二进制输出变量

仅当后续值与特定值匹配时,才在列中回填Nas

多元正态分布的计算

名字的模糊匹配

如何合并不同列表中的数据文件,包括基于名称的部分匹配,而不是一对一等价

Data.table::Shift type=允许扩展数据(&Q;LAG&Q;)