【发布时间】:2016-03-29 16:23:22
【问题描述】:
我正在尝试对列表进行匹配,但我无法从我的函数中获得某种输出。循环在 vec[3] 处失败,这就是我使用 trycatch 的原因。但我仍然无法在我的函数输出中得到任何匹配。我无法输出任何东西。申请家庭也可以做同样的事情吗?
我试图在 vec 上匹配 loc。 vec[3] 将失败,因为我没有匹配。
vec=c('i am going to ooty corbett','i have to go to ooty', 'i have to go to manali')
loc=c('ooty','corbett')
out 是我试图为匹配构建的向量。
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)
使用 ifelse,我得到了它的工作。但仍然可以从我的方法中找到解决方案。
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
}
}
【问题讨论】:
-
该错误可能是因为
intersect给出了一个分配给“out”的0 长度向量。因此,您可以在分配之前使用if/else处理这种情况。或者,请参阅grepl(paste(loc, collapse = "|"), vec)或regmatches(vec, gregexpr(paste(loc, collapse = "|"), vec)) -
@alexis_laz:是的,vec[3] 将返回 null。这就是我使用 trycatch 的原因。我会用 ifelse 和另一个试试。但我认为使用设置操作会很快。所以我在考虑申请家庭。感谢您的帮助。
-
使用
if( length(...) ){ } else { }。你实际上并没有说有错误,所以tryCatch似乎不合适。 -
好吧,我也试过 if else。它不工作。
-
@alexis_laz: grepl 给了我索引,虽然我想要这些值。第二个给我的值正是我想要的,而且速度也很快,但我仍然想要一个解决方案来解决我的尝试。
标签: r function loops try-catch