2017-10-02 9 views
1

に追加の引数を持つ関数を減らす「これ」から文字列ベクトルの書き方:purrr ::単語の出現を蓄積し、この単純な例を考えてみましょう.F

library(purrr) 
library(stringr) 

sentences <- c("This is a sentence.", 
       "This is another sentence.", 
       "One more This") 

reduce(str_count(sentences, "This"), `+`)   # SUCCESS! Returns 3 

私は理解しようとしているがreduceに渡さsentencesでこれを書くためにどのように - 私の失敗:

reduce(sentences, str_count, pattern = "This")   # FAILS! unused argument (.x[[i]]) 
reduce(sentences, ~ str_count, pattern = "This")  # FAILS! Returns signature for str_count() 
reduce(sentences, ~ str_count(pattern = "This"))  # FAILS! Argument "string" missing with no default. 
reduce(sentences, ~ str_count("This"))     # FAILS! Returns wrong result, 4. 
reduce(sentences, ~ str_count(.x, pattern = "This") + str_count(.y, pattern = "This")) # FAILS! Returns wrong result, 1. 

EDIT:より明確にするために、Pythonアプローチを検討してください。

私は同様のRアプローチに興味がありますが、.countPythonのメソッドであるため、これが可能かどうかはわかりません。

+1

あなたは、これらすべての再書き込みのために再び出力が3であることを期待していますか?あなたはどのようにしてその総額が削減されていないことを期待していますか? reduceには、少なくとも2つのパラメータ(前の値と現在の値の1つ)を取る関数が必要です。あなたが本当にここで何をしようとしているのか分かりません。 'map(sentences、str_count、pattern =" This ")%>%reduce(\' + \ ')'を探していますか?そうでなければ、ここで減らそうとしていることは分かりません。 – MrFlick

+1

'str_count'はベクトル化されています。だからあなたの元のアプローチ、またはこれは: 'sentences%>%str_count(" This ")%>%reduce(' + ')'私にはかなり読みやすい。これらに加えてどんな改善が望まれますか? – www

+0

@MrFlickは、追加のコンテキストにPythonの同等の例を提供しようとしました。 – JasonAizkalns

答えて

2

この演習の目的は、あなたがこれを行う可能性が軽減内からstr_countに引数を渡す方法を示すことである場合:私は、コメント内の既存の提案があると思いますが

reduce(sentences, function(x, y, p) x + str_count(y, p), p = "This", .init = 0) 
#> [1] 3 

を同じ結果を達成するためのより読みやすい方法。追加の引数を渡す方法を示す簡単な方法は、文字列を引数として受け取り、結果として文字列を返す、str_c関数のようなものを使うことです。

reduce(sentences, str_c, sep = "___") 
#> [1] "This is a sentence.___This is another sentence.___One more This" 

reduce(sentences, str_c, sep = "___") %>% str_count("This") 
#> [1] 3 
関連する問題