gpt4 book ai didi

r - 在 Reduce 内的函数调用中传递要计算的省略号参数

转载 作者:行者123 更新时间:2023-12-04 16:59:06 32 4
gpt4 key购买 nike

背景

我有一个有趣的函数,可以使用 all.equal 比较列表中的向量.因为我正在使用 all.equal我想通过相关all.equal通过省略号的参数。无需向 all.equal 传递任何信息该功能按需要工作。

功能目标

  • 该功能旨在提供all.equal的修改版本。调用处理任意数量的向量
  • 每个向量可以有任意数量的元素;但是,如果所有向量的长度不同,该函数将返回 false。
  • 该函数应该能够利用 all.equal 中可用的参数。 .例如向量 c(1.1, 2) , c(1, 2)c(1.3, 2)如果 tolerance 将被视为相等提供了具有正确值的参数。问题与让这个工作有关。

  • 例子

    比较 1,000 个向量,每个向量由三个整数组成。
        compare_multiple_vectors(x = lapply(
    X = vector(mode = "list", length = 1e3),
    FUN = function(...) {
    c(1, 2, 3)
    }
    ))

    # [1] TRUE

    问题/预期结果
    all.equaltolerance = 1 调用在以下向量列表中将返回预期 TRUE
    all.equal(c(1,2), c(1,1), tolerance = 1)
    # [1] TRUE

    tolerance = 1 参数无法过滤到内部 Reduce .
    compare_multiple_vectors(x = list(c(1,2), c(1,1)), tolerance = 1)
    # [1] FALSE

    期望的结果应该是 TRUE .

    代码
    #' @title Compare Values of Multiple Vectors
    #'
    #' @description The function compares values across multiple vectors using
    #' \code{\link[base]{all.equal}}.
    #'
    #' @param x Alist of vectors to compare
    #' @param ... as in \code{\link[base]{all.equal}}
    #'
    #' @return A logical
    #'
    #' @export
    #'
    #' @importFrom checkmate assert_atomic_vector
    #'
    #' @examples
    #' # Returns TRUE
    #' compare_multiple_vectors(c(1,1,1), c(1,1,1))
    #' # Returns FALSE
    #' compare_multiple_vectors(c(1,1,1), c(1,1,1), c(1,2,1))
    #' # Returns FALSE
    #' compare_multiple_vectors(c(1,2,3), c(3,2,1))
    compare_multiple_vectors <- function(x, ...) {
    # Check if all elements of x are atomic vectors
    Vectorize(FUN = checkmate::assert_atomic_vector,
    vectorize.args = "x")(x)

    # Compare list elements
    Reduce(
    f = function(a, b, ...) {
    if (isTRUE(all.equal(target = a, current = b, ...))) {
    a
    } else {
    FALSE
    }
    },
    x = x
    ) -> res_red

    # Return results
    if (isFALSE(res_red)) {
    return(FALSE)
    } else {
    return(TRUE)
    }
    }

    笔记
  • 我有兴趣使用省略号并按原样保留初始调用
    compare_multiple_vectors(x = list_of_vectors_to_compare, 
    ... # all.equal arguments
    )
  • 最佳答案

    我认为只需要一点点改变:

    compare_multiple_vectors <- function(x, ...) {
    # Check if all elements of x are atomic vectors
    Vectorize(FUN = checkmate::assert_atomic_vector,
    vectorize.args = "x")(x)

    # Compare list elements
    Reduce(
    f = function(a, b) { # <===================== Remove *...*

    if (isTRUE(all.equal(target = a, current = b, ...))) {
    a
    } else {
    FALSE
    }
    },
    x = x
    ) -> res_red

    # Return results
    if (isFALSE(res_red)) {
    return(FALSE)
    } else {
    return(TRUE)
    }
    }

    Reduce 的参数 f 似乎有一个 签名像函数(x,y)。所以Reduce 会忽略f 中的...。如果去掉 f 的省略号,... 将从外层空间引用,并会得到你想要的正确结果。

    关于r - 在 Reduce 内的函数调用中传递要计算的省略号参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53973608/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com