你已经apply
在你的代码中使用了,所以我可能误解了这个问题,但我想答案是
> invertible = function(n) sapply(n, function(x) x == revdigits(x))
> invertible(c(99, 123, 1691))
[1] TRUE FALSE FALSE
revdigits
这提醒了我们一个不太正常的事实。很难说出您打算做什么,因为您的代码原样不包括函数中的 for 循环并且存在语法错误:
> revdigits =
+ function(n) {
+ sapply(lapply(strsplit(as.character(n),""),rev),paste,collapse="")
+ }
>
>
> for(i in 1:length(n)){
+ n[i]=
+ if(n[i]==0) 0
+ else if(n[i] == 1) 1
+ else if(n[i] == 6) 9
+ else if(n[i] == 8) 8
+ else if(n[i] == 9) 6
+ else -1
+ }
Error: object 'n' not found
> }
Error: unexpected '}' in "}"
revdigits
as is 只是简单地颠倒数字顺序并将数字转换为字符串:
> revdigits(c(123,69))
[1] "321" "96"
要了解它是如何做到的,让我们看看sapply
看起来不是你自己写的,用一个简单的例子从里到外分析:
> n <- 69
> as.character(n)
[1] "69"
> strsplit(as.character(n),"")
[[1]]
[1] "6" "9"
> lapply(strsplit(as.character(n),""),rev)
[[1]]
[1] "9" "6"
> sapply(lapply(strsplit(as.character(n),""),rev),paste,collapse="")
[1] "96"
所以你的循环看起来应该在最后一步之前应用于数字向量。将你的循环打包成一个函数:
rotate = function(n) {
for(i in 1:length(n)){
n[i]=
if(n[i]==0) 0
else if(n[i] == 1) 1
else if(n[i] == 6) 9
else if(n[i] == 8) 8
else if(n[i] == 9) 6
else -1
}
n
}
测试:
> rotate(0:9)
[1] 0 1 -1 -1 -1 -1 9 -1 8 6
并申请revdigits
revdigits = function(n) {
sapply(lapply(lapply(strsplit(as.character(n),""),rev),rotate),paste,collapse="")
}
我们得到了一些似乎有效的东西:
> revdigits(69)
[1] "69"
> revdigits(99)
[1] "66"
更好的是,它已经适用于向量!
> n <- c(99, 123, 1691)
> revdigits(n)
[1] "66" "-1-11" "1691"
> invertible <- function(n) n == revdigits(n)
> invertible(n)
[1] FALSE FALSE TRUE
根本不需要使用索引。