2017-04-12 9 views
0

以下の関数を作成しました。結果としてRは1を返すはずですが、結果は何もありませんか?それは何をすべきr関数は結果を返しません

phrasedis <- function(string, phrase1, phrase2,n) { 
    char1 <- unlist(gregexpr(phrase1,string)) 
    char2 <- unlist(gregexpr(phrase2,string)) 

    for (i in 1: 2) { 
     for (j in 1: 2) { 
     pos1[i] <- sapply(strsplit(substr(text, 0,char1[i]-1),"\\s"),length)+1 
     pos2[j] <- sapply(strsplit(substr(text, 0,char2[j]-1),"\\s"),length)+1 
     dist <- pos2[i] - pos1[j] 

     a <- ifelse(pos1[i]>0 & pos2[j]>0 & dist>0 & dist<=6,1,0) 
     if (a==1) break 
     return(a) 
     } 

    } 
} 

text <- "phone rang a b c d e f z y z phone rang but no answer" 
b <- sapply(text, FUN=function(str) phrasedis(str,"phone rang" , "no answer",6)) 

そうでない場合は0を返す 、携帯電話との距離が鳴ったと何の答えが6つの未満の言葉ではない場合は1を返すようであるあなたの助けのためにありがとうございました。

+0

こんにちはヨリス、ありがとうございましたが、休憩を削除した後、それはまだ私にどんな結果を与えるものではありません。 – baver

+0

これは、あなたの関数があなたがそれらを変更したい前に定義された 'pos1'と' pos2'オブジェクトを持っていないからです。ループの前に 'pos1 < - pos2 < - c(0,0)'を追加し、return文を関数の絶対終わりに移動します。 –

+0

こんにちは、申し訳ありません、それは1を返しませんが、私はにテキストを変更したときに、それはまだそれが何の問題が何であるかをテキスト1を返さないように1が見える返す「電話は、B、C、DのE F zをyのzの電話はD E Fを鳴らし鳴らしました」。 – baver

答えて

4

機能のロジックが間違っています。

まず、return()ステートメントがループ内に配置されるため、ループはそのreturn()ステートメントのために最初の繰り返しで常に停止します。

次に、ベクトルpos1pos2を作成しないため、関数が機能しなくなることがあります。おそらく、あなたがエラーについて文句を言わない唯一の理由は、おそらくあなたの地球環境にpos1pos2があるからです。

しかし、return文を最後に置いて、長さ2のpos1とpos2ベクトルを作成しても、ループが間違っているため、関数は機能しません。

phrase1phrase2の両方で正確に一致するものが2つある場合を除いて、1と2のループがあります。stringです。そのため、phrase2の一致は1つだけです。j==2の結果がsubstr(text, 0, char2[j] -1)の場合、正確な長さは1ですので、pos2 [j]は2になります。pos1 [i]はまだ1です。あなたの条件は1です。

これは、あなたがそれを行うことができる方法である:

phrasedis <- function(string, phrase1, phrase2,n) { 
    char1 <- gregexpr(phrase1,string)[[1]] 
    char2 <- gregexpr(phrase2,string)[[1]] 

    # -1 is returned if no match was found for either phrase 
    if(any(c(char1,char2) == -1)){ 
    return(0) 
    } 
    # Calculate the end positions of the words 
    end1 <- char1 + attr(char1, "match.length") 

    #set a to 0 
    a <- 0 
    # loop over all matches in char1 
    for(i in seq_along(char1)){ 
    # Find the closest match for phrase 2 
    thepos <- which.min(abs(char2 - end1[i])) 
    # get all words in between. 
    # Don't forget to trim white spaces before and after 
    inbetween <- trimws(substring(string, end1[i], char2[thepos]-1)) 
    inbetween <- strsplit(inbetween,"\\s")[[1]] 
    if(length(inbetween) <= n){ 
     a <- 1 
     break 
    } 

    } 
    return(a) 
} 

これは、それがどのように動作するかです:

> text <- "phone rang a b cd phone rang d e f g h i no answer" 

> phrasedis(text,"phone rang" , "no answer",6) 
[1] 1 

> text <- " There is nothing in this text" 

> phrasedis(text,"phone rang" , "no answer",6) 
[1] 0 

> text <- "No answer but the phone rang" 

> phrasedis(text,"phone rang" , "no answer",6) 
[1] 0 
+0

詳細な回答をいただき、ありがとうございます。私はRには新しく、これは私の最初の機能です。あなたの答えは本当に助けになりました。 – baver

関連する問題