[更新] ==============================================================
尊重下面的[旧]答案,我发现它之所以有效是因为我将所有数字放在一个单独的原子向量中;其中一个是字符,因此每个数字都变成了字符。
如果我们使用列表(因此不进行强制转换),则所有测试都正确通过,但有一个测试未通过:1/(1 - 0.98)
,它仍然是一个numeric
。这是因为tol
参数默认为100 * .Machine$double.eps
,而该数字远远小于50
的两倍。因此,对于这种类型的数字,我们必须决定我们的公差!
因此,如果您想让所有测试变为TRUE
,可以使用assertive::is_whole_number(x, tol = 200 * .Machine$double.eps)
无论如何,我确认IMO assertive仍然是最佳解决方案。
以下是此[更新]的reprex。
expect_trues_c <- c(
cl = sqrt(2)^2,
pp = 9.0,
t = 1 / (1 - 0.98),
ar0 = 66L,
ar1 = 66,
ar2 = 1 + 2^-50,
v = 222e3,
w1 = 1e4,
w2 = 1e5,
v2 = "1000000000000000000000000000000000001",
an = 2 / 49 * 49,
ju1 = 1e22,
ju2 = 1e24,
al = floor(1),
v5 = 1.0000000000000001
)
str(expect_trues_c)
assertive::is_whole_number(expect_trues_c)
expect_trues_l <- list(
cl = sqrt(2)^2,
pp = 9.0,
t = 1 / (1 - 0.98),
ar0 = 66L,
ar1 = 66,
ar2 = 1 + 2^-50,
v = 222e3,
w1 = 1e4,
w2 = 1e5,
v2 = "1000000000000000000000000000000000001",
an = 2 / 49 * 49,
ju1 = 1e22,
ju2 = 1e24,
al = floor(1),
v5 = 1.0000000000000001
)
str(expect_trues_l)
assertive::is_whole_number(expect_trues_l)
assertive::is_whole_number(expect_trues_l, tol = 200 * .Machine$double.eps)
expect_falses <- list(
bb = 5 - 1e-8,
pt1 = 1.0000001,
pt2 = 1.00000001,
v3 = 3243.34,
v4 = "sdfds"
)
str(expect_falses)
assertive::is_whole_number(expect_falses)
assertive::is_whole_number(expect_falses, tol = 200 * .Machine$double.eps)
此文档由reprex package (v0.3.0)于2019年7月23日创建
[旧版] =================================================================
在我看来,最佳解决方案来自assertive
包(目前为止,该包已解决了本主题中所有的正面和负面示例):
are_all_whole_numbers <- function(x) {
all(assertive::is_whole_number(x), na.rm = TRUE)
}
are_all_whole_numbers(c(
cl = sqrt(2)^2,
pp = 9.0,
t = 1 / (1 - 0.98),
ar0 = 66L,
ar1 = 66,
ar2 = 1 + 2^-50,
v = 222e3,
w1 = 1e4,
w2 = 1e5,
v2 = "1000000000000000000000000000000000001",
an = 2 / 49 * 49,
ju1 = 1e22,
ju2 = 1e24,
al = floor(1),
v5 = 1.0000000000000001
))
are_all_not_whole_numbers <- function(x) {
all(!assertive::is_whole_number(x), na.rm = TRUE)
}
are_all_not_whole_numbers(c(
bb = 5 - 1e-8,
pt1 = 1.0000001,
pt2 = 1.00000001,
v3 = 3243.34,
v4 = "sdfds"
))
这段内容是由reprex package (v0.3.0)于2019年7月23日创建的
round(x)
被正确实现,将其应用于整数的结果始终是该整数... - Stephenis.integer
检查计算概念,而check.integer
用户函数则检查数学角度。 - João Daniel