传递要在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)
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 vectorsReduce
没有..
参数,但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)
}
}