执行标准回收规则

时间:2012-02-17 20:41:47

标签: r

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

  

在同一表达式中出现的向量不必全部具有相同的长度。如果不是,则表达式的值是一个向量,其长度与表达式中出现的最长向量相同。表达式中较短的向量经常需要(可能是分数)再循环,直到它们与最长向量的长度匹配。特别是一个常数只是重复。

大多数标准函数都使用它,但执行此操作的代码隐藏在底层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是可能具有不同长度和未知类型/类的向量,是否有规范方法可以获得一组可回收的新向量根据标准回收规则?特别是,我不能假设“做某事”步骤本身会进行适当的回收,所以我需要事先自己做。

3 个答案:

答案 0 :(得分:22)

我过去曾经使用过这个,

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

答案 1 :(得分:8)

我可能会使用length.out的{​​{1}}参数来完成大部分实际工作。

这是一个创建rep()函数的例子(它应该被称为better.data.frame()),它不会限制它作为参数传递的向量的长度。在这种情况下,我将所有载体回收到最长的载体长度,但您显然可以根据自己的回收需求进行调整!

"better".data.frame()

答案 2 :(得分:1)

数字参数的一条简陋路线是依靠cbind的自动回收。例如:

f.abc <- function(a,b,c) {

     df.abc <- as.data.frame( suppressWarnings( cbind(a=a, b=b, c=c) ) )

     #Then use, for example, with() to use a, b and c inside the data frame, 
     #or apply(df.abc,1, ...) 
}

但它确实很大程度上依赖于没有其他合理的警告原因。