use*_*592 2 r division coercion
我必须添加一个2位数的检查(除以97的剩余部分)到52/200005/0001之类的数字(必须忽略斜杠).
我的代码如下,但由于数字太大而失败:
AppendCheckDigits <- function (x) {
stopifnot(is.character(x) & length(x) == 1 & nchar(x) == 14)
cd <- as.integer(paste(substring(x, 1, 2),
substring(x, 4, 9),
substring(x, 11, 14), sep="")) %% 97
paste(x, "/", cd, sep="")
}
Run Code Online (Sandbox Code Playgroud)
用以下方法测试:
AppendCheckDigits("52/200005/0001")
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
类的对象integer限制在2*10 ^ 9左右.您应该使用as.numeric而不是as.integer在您的函数中:
AppendCheckDigits <- function (x) {
stopifnot(is.character(x) & length(x) == 1 & nchar(x) == 14)
cd <- as.numeric(paste(substring(x, 1, 2),
substring(x, 4, 9),
substring(x, 11, 14), sep="")) %% 97
paste(x, "/", cd, sep="")
}
Run Code Online (Sandbox Code Playgroud)
然后 :
> AppendCheckDigits("52/200005/0001")
[1] "52/200005/0001/43"
Run Code Online (Sandbox Code Playgroud)
请注意,您可以通过这种方式向量化和简化功能,例如:
AppendCheckDigits <- function (x) {
stopifnot(is.character(x) & nchar(x) == rep(14,length(x)))
num <- as.numeric(gsub("/","", x)) %% 97
return(paste0(x, "/", num))
}
Run Code Online (Sandbox Code Playgroud)
然后 :
> AppendCheckDigits(c("52/200005/0001", "52/200005/0021"))
[1] "52/200005/0001/43" "52/200005/0021/63"
Run Code Online (Sandbox Code Playgroud)