2012-10-05 103 views
0
word <- c('abc [email protected]','text with no email','first [email protected] also [email protected]') 
pattern <- '[-A-Za-z0-9_.%][email protected][-A-Za-z0-9_.%]+\\.[A-Za-z]+' 


getmail<-function(pattern,word){ 
mail<<-c() 
sapply(word,function(x){ 
out<-gregexpr(pattern,x) 
for (i in 1:length(out[[1]])){ 
if (out[[1]][i]>0) 
mail<<-union(mail,substr(x,start=out[[1]][i],stop=out[[1]][i]+attr(out[[1]],"match.length")[i]-1)) 
}}) 
return(mail) 
} 

getmail(pattern,word) 

[1] "[email protected]" "[email protected]"   "[email protected]"  
ls() 
[1] "getmail" "mail" "pattern" "word"  

該函數得到的結果,但我覺得它是更好的,如果沒有全局變量mail在我運行getmail(模式,單詞)後的命名空間,我該如何修改它? 不要刪除sapply函數,按照我的方式,只是不要讓名字空間中的mail修改刪除R函數中全局變量的函數?

我知道我能以更簡單的方式得到結果,但我想了解更多關於功能的內容。

mail<-c() 
out<-gregexpr(pattern,word) 
for (i in 1:length(out)){ 
    for (j in 1:length(out[[i]])){ 
    if (out[[i]][j]>0) 
    mail<-union(mail,substr(word[i],start=out[[i]][j],stop=out[[i]][j]+attr(out[[i]],"match.length")[j]-1))}} 
mail 
[1] "[email protected]" "[email protected]"   "[email protected]"  
+0

你只是簡單地使用'sapply'錯誤。 –

回答

0

我可能會利用矢量化,並跳過大部分循環的:

> m <- gregexpr(pattern,word) 
> lapply(seq_along(word), 
     function(i){substring(word[i],m[[i]],m[[i]] + attr(m[[i]],"match.length"))}) 
[[1]] 
[1] "[email protected]" 

[[2]] 
[1] "" 

[[3]] 
[1] "[email protected] " "[email protected]" 

其中還有讓你基本上所有的方式,只有兩行。是的,你需要過濾出空的字符串,也許修剪一些空白區域,但我認爲這是更清潔。