あなたはすでに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
そのままでは、数字の順序を逆にして、数字を文字列に変換します。
> 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
インデックスを使用する必要はまったくありません。