我在R中提取函数参数时遇到问题。
x="theme(legend.position='bottom',
legend.margin=(t=0,r=0,b=0,l=0,unit='mm'),
legend.background=element_rect(fill='red',size=rel(1.5)),
panel.background=element_rect(fill='red'),
legend.position='bottom')"
我想要的是:
[1]legend.position='bottom'
[2]legend.margin=(t=0,r=0,b=0,l=0,unit='mm')
[3]legend.background=element_rect(fill='red',size=rel(1.5))
[4]panel.background=element_rect(fill='red')
[5]legend.position='bottom'
我尝试了几个正则表达式但没有成功,包括以下内容:
strsplit(x,",(?![^()]*\\))",perl=TRUE)
请帮帮我!
答案 0 :(得分:1)
我认为这里最好的答案可能是不尝试使用正则表达式来解析函数调用。顾名思义,正则表达式需要常规语言。您的函数调用不常规,因为它具有嵌套括号。我目前看到最大嵌套深度为2,但是谁知道在某些时候这可能会变得更深。
我建议改为编写一个简单的解析器。您可以在此处使用堆栈来跟踪括号。如果所有括号都关闭,你只会关闭一个参数,这意味着你不在参数的中间,除了可能是第一个参数。
答案 1 :(得分:0)
Arf,我真的很抱歉,但我必须继续工作,我会在以后继续,但现在我只是让我的方式部分地解决它:theme\(([a-z.]*=['a-z]*)|([a-z._]*=[a-z0-9=,'_.()]*)*\,\)?
它只错过了最后一部分..
此处为regex101页面:https://regex101.com/r/BZpcW0/2
稍后见。
答案 2 :(得分:0)
感谢您的所有建议。我已经解析了句子并将参数作为列表。这是我的解决方案。
x<-"theme(legend.margin=margin(t=0,r=0,b=0,l=0,unit='mm'),
legend.background=element_rect(fill='red',size=rel(1.5)),
panel.background=element_rect(fill='red'),
legend.position='bottom')"
extractArgs=function(x){
result<-tryCatch(eval(parse(text=x)),error=function(e) return("error"))
if("character" %in% class(result)){
args=character(0)
} else {
if(length(names(result)>0)){
pos=unlist(str_locate_all(x,names(result)))
pos=c(sort(pos[seq(1,length(pos),by=2)]),nchar(x)+1)
args=c()
for(i in 1:(length(pos)-1)){
args=c(args,substring(x,pos[i],lead(pos)[i]-2))
}
} else{
args=character(0)
}
}
args
}