Regex 从文本文件中可靠地提取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 <- "

我想在我的R脚本中找到我经常使用的命名函数(忽略诸如“+”和“$”和“[”之类的运算符)。如何编写一个与函数名称匹配的优雅可靠的正则表达式一直困扰着我。下面是一个小示例和我迄今为止笨拙的代码。我欢迎更干净、更可靠和更全面的代码

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"