2016-03-29 10 views
0

Ich versuche, eine Übereinstimmung über eine Liste zu tun, aber ich bin nicht in der Lage, eine Art von Ausgabe von meiner Funktion zu erhalten. die schleife versagt bei vec [3] deshalb habe ich trycatch benutzt. aber ich bin immer noch nicht in der Lage, irgendwelche Übereinstimmungen in der Ausgabe meiner Funktion zu bekommen. Ich kann nichts ausgeben. könnte das gleiche auch mit der anwendungsfamilie gemacht werden?Schleife über einen Vektor mit trycatch

Ich versuche, loc über vec. vec [3] wird scheitern, da ich keine Übereinstimmung habe.

vec=c('i am going to ooty corbett','i have to go to ooty', 'i have to go to manali') 
loc=c('ooty','corbett') 

ist der Vektor im Versuch, für die Übereinstimmungen zu bauen.

out=NULL 
res_m=function(x,y){ 
    out[i]=tryCatch(
     { 
      for(i in 1:length(y)){ 
       print(i) 
       x=tolower(x) 
       y=strsplit(y[i], " ")[[1]] 
       out[i]=intersect(x,y) 
      } 
     },error=function(cond) { 
      out[i]=NA 
     }, 
     finally=print("can do") 
    )  
    return(out[i]) 
} 
res=res_m(loc,vec) 

Mit ifelse, ich habe es zur Arbeit. aber immer noch, wenn ich eine Lösung aus meinem Ansatz herausholen könnte.

res=NULL 
out=NULL 

for (i in 1:length(y)) { 
    print(i) 
    x = tolower(x) 
    z = strsplit(y[i], " ")[[1]] 
    out = intersect(x,z) 
    if (length(out) == 0) { 
     res[i] = NA 
    }else{ 
     res[[i]] = out 
    } 
} 
+1

Der Fehler verwenden könnte, ist wahrscheinlich, weil 'intersect' gibt eine 0-Länge Vektor, der zugeordnet ist "raus". Sie können diesen Fall also mit einem 'if/else' vor der Zuweisung behandeln. Alternativ, siehe 'grepl (einfügen (loc, collapse =" | "), vec)' oder 'regmatches (vec, gregexpr (einfügen (loc, collapse =" | "), vec))' –

+0

@alexis_laz: yeah the vec [3] gibt null zurück. Deshalb habe ich trycatch verwendet. Ich werde es mit ifelse und dem anderen auch versuchen. aber ich denke, mit Set-Betrieb wäre schnell. also habe ich an linien von apply family gedacht. Danke für die Hilfe. –

+0

Verwenden Sie 'if (length (...)) {} else {}'. Sie haben nicht wirklich gesagt, dass ein Fehler aufgetreten ist, daher erscheint 'tryCatch' nicht angemessen. –

Antwort

1

In Ihrem res_m Sie nicht initialisieren "out" als geeignetes Objekt und, auch, Sie überschreiben "y":

res_m = function(x, y) 
{ 
    out = vector("list", length(y)) 
    for(i in 1:length(y)) { 
     x = tolower(x) 
     yy = strsplit(y[i], " ")[[1]] 
     out[[i]] = intersect(x, yy)  
    } 

    return(out) 
} 
res_m(loc, vec) 
#[[1]] 
#[1] "ooty" "corbett" 
# 
#[[2]] 
#[1] "ooty" 
# 
#[[3]] 
#character(0) 

Sie tolower und strsplit aus bewegen können Ihre Schleife:

res_m2 = function(x, y) 
{ 
    out = vector("list", length(y)) 
    x = tolower(x) 
    y = strsplit(y, " ") 
    for(i in seq_along(y)) out[[i]] = intersect(x, y[[i]]) 
    return(out) 
} 
res_m2(loc, vec) 
#[[1]] 
#[1] "ooty" "corbett" 
# 
#[[2]] 
#[1] "ooty" 
# 
#[[3]] 
#character(0) 

Oder verwenden lapply:

Wenn Sie haben einen Fehler zu machen:

force_error = function(x, y) 
{ 
    out = vector("list", length(y)) 
    x = tolower(x) 
    y = strsplit(y, " ") 
    for(i in seq_along(y)) 
     tryCatch(expr = { out[i] = intersect(x, y[[i]]) }, 
       error = function(e) { 
        cat(sprintf("error in in 'i = %d'\n --> %s\n", i, e)) 
        out[i] <<- NA 
       }, 
       warning = function(w) { 
        cat(sprintf("warning in in 'i = %d'\n --> %s\n", i, w)) 
        out[i] <<- NA 
       }) 
    return(out) 
} 
force_error(loc, vec) 
#warning in in 'i = 1' 
# --> simpleWarning in out[i] = intersect(x, y[[i]]): number of items to replace is not a multiple of replacement length 
# 
#error in in 'i = 3' 
# --> Error in out[i] = intersect(x, y[[i]]): replacement has length zero 
# 
#[[1]] 
#[1] NA 
# 
#[[2]] 
#[1] "ooty" 
# 
#[[3]] 
#[1] NA 

Alternativ Sie

regmatches(vec, gregexpr(paste(loc, collapse = "|"), vec)) 
#[[1]] 
#[1] "ooty" "corbett" 
# 
#[[2]] 
#[1] "ooty" 
# 
#[[3]] 
#character(0) 
+0

Perfekte Antwort! Vielen Dank! Ich habe hier viele dumme Fehler gemacht. Deine Antwort ist sehr nützlich. –

Verwandte Themen