Regex 从文本文件中可靠地提取R函数的名称
我想在我的R脚本中找到我经常使用的命名函数(忽略诸如“+”和“$”和“[”之类的运算符)。如何编写一个与函数名称匹配的优雅可靠的正则表达式一直困扰着我。下面是一个小示例和我迄今为止笨拙的代码。我欢迎更干净、更可靠和更全面的代码Regex 从文本文件中可靠地提取R函数的名称,regex,r,Regex,R,我想在我的R脚本中找到我经常使用的命名函数(忽略诸如“+”和“$”和“[”之类的运算符)。如何编写一个与函数名称匹配的优雅可靠的正则表达式一直困扰着我。下面是一个小示例和我迄今为止笨拙的代码。我欢迎更干净、更可靠和更全面的代码 test1 <- "colnames(x) <- subset(df, max(y))" test2 <- "sat <- as.factor(gsub('International', 'Int'l', sat))" test3 <- "
test1 <- "colnames(x) <- subset(df, max(y))"
test2 <- "sat <- as.factor(gsub('International', 'Int'l', sat))"
test3 <- "score <- ifelse(str_detect(as.character(sat), 'Eval'), 'Importance', 'Rating')"
test <- c(test1, test2, test3)
test1正则表达式可能有效,但您可以使用R本身来帮助您。我将您的四行代码放入一个文件test.R
,修复了语法问题并运行了以下程序:
library(dplyr)
tmp <- getParseData(parse("test.R", keep.source=TRUE))
tmp %>% filter(token=="SYMBOL_FUNCTION_CALL")
## line1 col1 line2 col2 id parent token terminal text
## 1 1 1 1 8 1 3 SYMBOL_FUNCTION_CALL TRUE colnames
## 2 1 16 1 21 11 13 SYMBOL_FUNCTION_CALL TRUE subset
## 3 1 27 1 29 19 21 SYMBOL_FUNCTION_CALL TRUE max
## 4 2 8 2 16 39 41 SYMBOL_FUNCTION_CALL TRUE as.factor
## 5 2 18 2 21 42 44 SYMBOL_FUNCTION_CALL TRUE gsub
## 6 3 10 3 15 72 74 SYMBOL_FUNCTION_CALL TRUE ifelse
## 7 3 17 3 26 75 77 SYMBOL_FUNCTION_CALL TRUE str_detect
## 8 3 28 3 39 78 80 SYMBOL_FUNCTION_CALL TRUE as.character
## 9 5 12 5 17 119 121 SYMBOL_FUNCTION_CALL TRUE lapply
## 10 6 3 6 9 134 136 SYMBOL_FUNCTION_CALL TRUE setdiff
## 11 6 11 6 16 137 139 SYMBOL_FUNCTION_CALL TRUE unlist
## 12 6 18 6 23 140 142 SYMBOL_FUNCTION_CALL TRUE sapply
## 13 8 11 8 15 191 193 SYMBOL_FUNCTION_CALL TRUE union
正则表达式可能可以工作,但您可以使用R本身来帮助您。我将您的四行代码放入一个文件test.R
,修复了语法问题并运行了以下程序:
library(dplyr)
tmp <- getParseData(parse("test.R", keep.source=TRUE))
tmp %>% filter(token=="SYMBOL_FUNCTION_CALL")
## line1 col1 line2 col2 id parent token terminal text
## 1 1 1 1 8 1 3 SYMBOL_FUNCTION_CALL TRUE colnames
## 2 1 16 1 21 11 13 SYMBOL_FUNCTION_CALL TRUE subset
## 3 1 27 1 29 19 21 SYMBOL_FUNCTION_CALL TRUE max
## 4 2 8 2 16 39 41 SYMBOL_FUNCTION_CALL TRUE as.factor
## 5 2 18 2 21 42 44 SYMBOL_FUNCTION_CALL TRUE gsub
## 6 3 10 3 15 72 74 SYMBOL_FUNCTION_CALL TRUE ifelse
## 7 3 17 3 26 75 77 SYMBOL_FUNCTION_CALL TRUE str_detect
## 8 3 28 3 39 78 80 SYMBOL_FUNCTION_CALL TRUE as.character
## 9 5 12 5 17 119 121 SYMBOL_FUNCTION_CALL TRUE lapply
## 10 6 3 6 9 134 136 SYMBOL_FUNCTION_CALL TRUE setdiff
## 11 6 11 6 16 137 139 SYMBOL_FUNCTION_CALL TRUE unlist
## 12 6 18 6 23 140 142 SYMBOL_FUNCTION_CALL TRUE sapply
## 13 8 11 8 15 191 193 SYMBOL_FUNCTION_CALL TRUE union
问题中的代码没有有效语法,但如果我们更正它:
test1 <- "colnames(x) <- subset(df, max(y))"
test2 <- "sat <- as.factor(gsub('International', 'Intl', sat))"
test3 <- "score <- ifelse(str_detect(as.character(sat), 'Eval'), 'Importance', 'Rating')"
test <- c(test1, test2, test3)
给予:
> funs
[1] "{" "<-" "as.character" "as.factor" "colnames<-"
[6] "gsub" "ifelse" "max" "str_detect" "subset"
>funs
[1] “{”“问题中的代码没有有效语法,但如果我们更正它:
test1 <- "colnames(x) <- subset(df, max(y))"
test2 <- "sat <- as.factor(gsub('International', 'Intl', sat))"
test3 <- "score <- ifelse(str_detect(as.character(sat), 'Eval'), 'Importance', 'Rating')"
test <- c(test1, test2, test3)
给予:
> funs
[1] "{" "<-" "as.character" "as.factor" "colnames<-"
[6] "gsub" "ifelse" "max" "str_detect" "subset"
>funs
[1] {“太棒了!我从没听说过getParseData()。但是,我编辑了我的问题,以显示结果,并欢迎您进一步思考我的错误所在。非常好:此方法可以找出哪些对象实际上是闭包。任何基于正则表达式的方法都注定会失败,因为它只查找可能有效的字符串。--我猜此评论同样适用于Gabor的答案:-)太棒了!我从没听说过getParseData()。但是,我编辑了我的问题,以显示结果,并欢迎您进一步思考我的错误所在。非常好:此方法可以找出哪些对象实际上是闭包。任何基于正则表达式的方法都注定会失败,因为它只查找可能有效的字符串。--我猜此评论同样适用于Gabor的答案:-)谢谢你的代码更正。你还去掉了“Int'l”中的撇号“。在我的test4上尝试了codetools技术后,我意识到代码必须正确解析才能使findGlobals正常工作。对于这个问题,我只是认为一个包含很多函数的字符串就可以了。也许对于regex,但对于codetools或hrbrmstr的方法来说不是这样。这个问题有‘Int’l(两个单引号内的单引号)这是一个语法错误,因此必须进行更改。感谢您的代码更正。您还删除了“Int'l”中的撇号。在我的test4上尝试了codetools技术后,我意识到代码必须正确解析才能使findGlobals正常工作。对于这个问题,我只是认为一个包含很多函数的字符串就可以了。可能对于regex,但对于codetools或hrbrmstr的方法来说不是这样。这个问题有“Int'l”(两个单引号内的单引号)这是一个语法错误,因此必须对其进行更改。
test1 <- "colnames(x) <- subset(df, max(y))"
test2 <- "sat <- as.factor(gsub('International', 'Intl', sat))"
test3 <- "score <- ifelse(str_detect(as.character(sat), 'Eval'), 'Importance', 'Rating')"
test <- c(test1, test2, test3)
library(codetools)
f.text <- c("function(){", test, "}")
f <- eval(parse(text = f.text))
funs <- findGlobals(f, merge = FALSE)$functions
> funs
[1] "{" "<-" "as.character" "as.factor" "colnames<-"
[6] "gsub" "ifelse" "max" "str_detect" "subset"