Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
传递要在Reduce中的函数调用中计算的省略参数 背景_R_Function_Functional Programming_Namespaces_Ellipsis - Fatal编程技术网

传递要在Reduce中的函数调用中计算的省略参数 背景

传递要在Reduce中的函数调用中计算的省略参数 背景,r,function,functional-programming,namespaces,ellipsis,R,Function,Functional Programming,Namespaces,Ellipsis,我有一个有趣的函数,它使用all.equal比较列表中的向量。当我使用all.equal时,我希望通过省略号传递相关的all.equal参数。无需将任何内容传递给all.equal函数即可按需工作 职能目标 该函数旨在提供对任意数量的向量进行操作的all.equal调用的修改版本 每个向量可以具有任意数量的元素;但是,如果所有向量的长度不相等,则函数将返回false 函数应该能够利用all.equal中可用的参数。例如,如果提供了具有正确值的公差参数,则向量c(1.1,2),c(1,2)和c(

我有一个有趣的函数,它使用
all.equal
比较列表中的向量。当我使用
all.equal
时,我希望通过省略号传递相关的
all.equal
参数。无需将任何内容传递给
all.equal
函数即可按需工作

职能目标
  • 该函数旨在提供对任意数量的向量进行操作的
    all.equal
    调用的修改版本
  • 每个向量可以具有任意数量的元素;但是,如果所有向量的长度不相等,则函数将返回false
  • 函数应该能够利用
    all.equal
    中可用的参数。例如,如果提供了具有正确值的
    公差
    参数,则向量
    c(1.1,2)
    c(1,2)
    c(1.3,2)
    将被视为相等。现在的问题是如何让它发挥作用
例子 比较1000个向量,每个向量由三个整数组成

    compare_multiple_vectors(x = lapply(
              X = vector(mode = "list", length = 1e3),
              FUN = function(...) {
                  c(1, 2, 3)
              }
          ))

    # [1] TRUE
问题/预期结果 在下列向量列表中使用
tolerance=1调用
all.equal
将返回预期的
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


代码
我想只需要一点改变:

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)
    }
}

比较多个向量我想只需要一点改变:

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)
    }
}

compare\u multiple\u vectors
Reduce
没有
..
参数,但
Map
有。像这样的
映射(函数(a,b,…)all.equal(a,b,…),list(c(1,2)),list(c(1,1)),公差=1)
这样做吗?请注意,列表现在是两个列表。或者干脆
Map(all.equal,list(c(1,2)),list(c(1,1)),tolerance=1)
。显然,
Map
识别出了
all.equal
@RuiBarradas的省略号参数,我认为这是可行的;当Reduce总是比较两个向量时,这会如何影响性能?另外,我想传递一个参数作为向量列表来检查,对于Map,这必须分解成单独的列表,对于向量数为奇数的列表,我想不清楚您正在尝试什么样的比较,以及需要什么样的错误检查。我们可以假设列表中的所有条目的长度都是2吗?还是有些长度不同?这一切都需要一套测试用例和一套相应的解释来解释为什么应该提供指定的结果。结果不需要是列表的形式,而不是向量的形式吗?(投票结束,因为不清楚,但会鼓励你澄清,这样我可以撤销投票。)@42-谢谢你看这个。我已经阐明了函数应该做什么。
Reduce
没有
..
参数,但是
Map
有。像这样的
映射(函数(a,b,…)all.equal(a,b,…),list(c(1,2)),list(c(1,1)),公差=1)
这样做吗?请注意,列表现在是两个列表。或者干脆
Map(all.equal,list(c(1,2)),list(c(1,1)),tolerance=1)
。显然,
Map
识别出了
all.equal
@RuiBarradas的省略号参数,我认为这是可行的;当Reduce总是比较两个向量时,这会如何影响性能?另外,我想传递一个参数作为向量列表来检查,对于Map,这必须分解成单独的列表,对于向量数为奇数的列表,我想不清楚您正在尝试什么样的比较,以及需要什么样的错误检查。我们可以假设列表中的所有条目的长度都是2吗?还是有些长度不同?这一切都需要一套测试用例和一套相应的解释来解释为什么应该提供指定的结果。结果不需要是列表的形式,而不是向量的形式吗?(投票结束,因为不清楚,但会鼓励你澄清,这样我可以撤销投票。)@42-谢谢你看这个。我已经澄清了这个函数应该做什么。您和OP都没有在一系列示例上演示测试。关于:
比较多个向量(c(2.4,2),c(1,2),c(-.1,2),容差=1)
?@42-试试
比较多个向量(x=list(c(2.4,2),c(1,2),c(-.1,2)),容差=1)
?是的。为什么即使公差为1,2.4也应该“等于”-.1。@42-好吧,我的结果是假的,意思是不相等,这就是我重复它时得到的结果<代码>比较多个向量(x=list(c(2.4,2),c(1,2),c(.1,2)),公差=1)
确实返回TRUE,但在该“跨度”上的all.eqaul也返回TRUE。我想这真的是all.equal的行为,它似乎不符合其帮助页面对如此大的公差的描述。如果您对您的答案进行一个小的编辑,我将能够反转我的DoownVote。您和OP都未能在一系列示例上演示测试。关于:
比较多个向量(c(2.4,2),c(1,2),c(-.1,2),容差=1)
?@42-试试
比较多个向量(x=list(c(2.4,2),c(1,2),c(-.1,2)),容差=1)
?是的。为什么即使公差为1,2.4也应该“等于”-.1。@42-好吧,我的结果是假的,意思是不相等,这就是我重复它时得到的结果<代码>比较多个向量(x=list(c(2.4,2),c(1,2),c(.1,2)),公差=1)
确实返回TRUE,但在该“跨度”上的all.eqaul也返回TRUE。我想这真的是all.equal的行为,它似乎不符合其帮助页面对如此大的公差的描述。如果您对您的答案进行一个小的编辑,我将能够反转我的投票。
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)
    }
}