別のバージョンがraw()
ベクターにあなたの「言葉」を翻訳することです
frequency <- function(x,y)
{
word <- strsplit(x,'')
val <- table(word[1] == y)["TRUE"]
cat(val)
}
frequency("hih","h")
と:それはあなたが関数に比較を送信する機能的なアプローチを使用しています - 機能tableをチェック文字 'raw()
ベクトルと比較してください。ここで
frequency = function(word, letter)
sum(charToRaw(word) == charToRaw(letter))
四つの異なるソリューションが
f0 <- function(word, letter)
sum(strsplit(word, "")[[1]] == letter)
f1 <- function(word, letter)
sum(charToRaw(word) == charToRaw(letter))
f2a <- function(word, letter)
length(unlist(gregexpr(letter, word)))
f2b <- function(word, letter)
length(unlist(gregexpr(letter, word, fixed=TRUE)))
いくつかの正当性と性能を比較して
> word <- "foo"
> letter <- "o"
> identical(f0(word, letter), f1(word, letter))
[1] TRUE
> identical(f0(word, letter), f2a(word, letter))
[1] TRUE
> identical(f0(word, letter), f2b(word, letter))
[1] TRUE
> letter <- "a"
> identical(f0(word, letter), f1(word, letter))
[1] TRUE
> identical(f0(word, letter), f2a(word, letter))
[1] FALSE
> identical(f0(word, letter), f2b(word, letter))
[1] FALSE
> word <- paste(sample(letters, 10000, TRUE), collapse="")
> letter <- "a"
> microbenchmark(
+ f0(word, letter), f1(word, letter),
+ f2a(word, letter), f2b(word, letter)
+)
Unit: microseconds
expr min lq mean median uq max neval
f0(word, letter) 558.433 562.4755 579.03451 583.5590 584.8920 628.946 100
f1(word, letter) 71.482 78.7100 100.85787 80.0275 81.7035 2195.366 100
f2a(word, letter) 277.618 278.7280 280.94280 279.4870 280.4270 302.683 100
f2b(word, letter) 66.888 68.1800 69.07205 68.6205 69.3100 84.300 100
f2b()
は最速のも正しくないです。 f1()
は現時点では高速です(速度は手元の作業では重要ではありませんが)が正しいと思われます。
ループの代わりに、 'sum(word == y)'を試してください。しかし、あなたが見ている問題は 'strsplit(x、" ")[[1]]'を実行するか、 'unlist'をラップする必要があるからです。 – Frank
[[1]]]を追加する必要がある理由を説明できますか? –
最後に値を返す必要があります。 'print'は値を画面に出力しますが、NULLオブジェクトを返します。 'print(counter)'を 'counter'や' return(counter) 'に置き換えてください。 – lmo