我有一些来自朋友的R代码,它带有一个数字向量,并且对于每个数字检查这个数字是否相同颠倒。
numbers = (0:9)
upside_down_numbers = c(0,1,NA,NA,NA,NA,9,NA,8,6)
ref_table = rbind(numbers,upside_down_numbers)
invertible = function(n){
as.numeric(paste0(
upside_down_numbers[
1+rev(as.numeric(strsplit(as.character(n),"")[[1]]))
],collapse=""))}
如果输入的数字与返回的数字相同,我希望它返回TRUE 例如:
invertible(69)
[1] 69
如果输入的数字与返回的数字不同或返回NA,则输出和FALSE 例如:
invertible(99)
[66]
我还希望代码能够处理多个数字 例如:
invertible(c(1, 96, 99, 123, 1691))
[1] TRUE TRUE FALSE FALSE TRUE
真的卡在这一点上,会很感激一些建议。谢谢
答案 0 :(得分:2)
这绝对是一项不寻常的任务......但这对你有用。
invertible_test <- function(n) {
inverted <- suppressWarnings(invertible(n))
if (is.na(inverted)) {
return(FALSE)
}
return(n == inverted)
}
invertible_test_vector <- function(v) {
vapply(v, invertible_test, c(T))
}
这里通过了你的测试:
invertible_test_vector(c(1, 96, 99, 123, 1691))
[1] TRUE TRUE FALSE FALSE TRUE
答案 1 :(得分:1)
这是具有逻辑返回值的invertible
函数。看起来这就是你要求的,但不确定。
更新:这是一个比我之前写的更好的功能。并且它在n
invertible <- function(n)
{
spl <- lapply(strsplit(as.character(n), NULL), rev)
s <- sapply(spl, function(x) paste(udn[1 + as.numeric(x)], collapse = ""))
s == n
}
> udn <- c(0, 1, rep(NA, 4), 9, NA, 8, 6)
> n <- c(1, 96, 99, 123, 1691)
> invertible(n)
# [1] TRUE TRUE FALSE FALSE TRUE
但是写一个更好的方法是使用单个数字参数然后使用Vectorize
函数
invertible <- Vectorize(function(n) {
spl <- rev(unlist(strsplit(as.character(n), NULL)))
paste(udn[1 + as.numeric(spl)], collapse = "") == n
})