【发布时间】:2023-02-07 20:30:57
【问题描述】:
我正在编写一个函数来验证某些代码。
代码是应满足两个条件的整数:
- 属于n长度(为了这个例子,我们假设 2)
- 更复杂的检查(与这个简化的示例无关,但关键方面是这将需要多行代码和单独的分配)
为了避免无用的计算,我只希望函数在满足第一个条件时评估条件 2。
codes <- c(16, 19, 12, 8) is_valid <- function(code) { if (nchar(code) != 2) { return(FALSE) } else { # This part is not relevant val1 <- as.integer(substr(code, 1, 1)) val2 <- as.integer(substr(code, 2, 2)) sum <- val1 + val2 validator <- 10 - sum %% 3 return(validator == 0) } }问题:如果我传递单个元素(例如
is_valid(16),这很有效,但是如果我尝试传递向量is_valid(codes),我会收到此错误:Error in if (nchar(code) != 2) { : the condition has length > 1我知道这是因为
if没有向量化。我尝试用ifelse()替换它,但在这种情况下它实际上不起作用,因为第二个标准是一段多行代码。我觉得有一个简单的编程解决方案。
【问题讨论】:
-
我会重新编写您的函数以期待矢量化输入,或者查看基本函数
Vectorize()。 -
此外,
ifelse()不适合您的用例的另一个原因是ifelse()经常计算所有可能的输出 - 如果至少一个输入测试评估为“真”,至少一个“假”,它将计算两种结果对于输入向量的所有元素。
标签: r function vectorization