相关疑难解决方法(0)

在R中生成调用图

我已经获得了大量格式不佳的单片R代码,并且有很多功能,我想知道哪些函数调用了什么函数.

我以为我可以使用roxygen的@callGraph东西,但是a)代码需要在一个包中,这将是这个代码的头疼,并且b)当我在一个简单的上运行它时它似乎不起作用我的包裹.我看到其中一位Roxygen作者发布了一条帖子,称由于Rgraphviz依赖关系而禁用了调用图生成,但代码就在那里.无论如何.

任何人都有更好的方法来快速计算foo调用bar,baz和qux,而qux调用quux?

编辑:基于R的分析系统的解决方案很棒,假设您可以实际运行代码...文件中的一半东西不会运行,我不知道它做了什么...静态分析太多了我想是希望的.

编辑2:Roxygen的调用图东西似乎做了一个静态分析,基于函数表达式的递归下降和检查is.callable.能够在任何功能上运行它会很可爱......明天我可能会玩这个...

r call-graph

30
推荐指数
1
解决办法
3636
查看次数

检查某个函数是否在 R 的嵌套函数中使用

我想创建一个函数check_sym,它将另一个函数f作为参数并检查是否在f特定函数内部使用。

具体来说,我想检查是否使用f了形式的内部非标准评估!! sym

我可以用一个简单的技巧来做到这一点,将函数体转换为字符串,然后使用正则表达式检查"!!sym\\(".

library(dplyr)
library(purrr)
library(rlang)

check_sym <- function(f) {
  f <- as.list(body(f))
  f <- unlist(as.character(f))
  purrr::some(f, function(x) grepl("!!sym\\(", x))
}

foo <- function(df, x) { 
  select(df, !! sym(x))
}

check_sym(foo)
#> [1] TRUE
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.3.0)于 2020 年 2 月 16 日创建

然而,虽然这是可能的,但我正在寻找一种不依赖字符串和正则表达式的方法,而是理想情况下一些查看函数内部并在更深层次“看到”所有函数调用的方法,这会更可靠.

任何想法表示赞赏。

基于接受的答案的最终解决方案:

基于 MrFlick 下面的回答,我的实际解决方案如下:

我将 check_syms 定义为:

check_sym <- function(f) {
  grepl("!!sym", paste(all.names(body(f)), collapse = ""))
}
Run Code Online (Sandbox Code Playgroud)

"!! sym"与仅调用 example …

r function

5
推荐指数
2
解决办法
146
查看次数

如何获取函数中使用的内置函数列表

假设我有一个名为的函数Fun1,我在其中使用R的许多不同的内置函数用于不同的不同进程.然后,我如何获得此函数中使用的内置函数列表Fun1

  Fun1 <- function(x,y){
  sum(x,y)
  mean(x,y)
  c(x,y)
  print(x)
  print(y)
  }
Run Code Online (Sandbox Code Playgroud)

所以我的输出应该是这样的,即人物的名单sum,mean,c,print.因为这些是我在函数内部使用的内置函数Fun1.

我尝试过使用grep功能

 grep("\\(",body(Fun1),value=TRUE)
 # [1] "sum(x, y)"  "mean(x, y)" "c(x, y)"    "print(x)"   "print(y)" 
Run Code Online (Sandbox Code Playgroud)

它看起来不错,但论据不应该来,即xy.这里只是函数体内使用的函数名列表Fun1.

所以我的总体目标是在unique list of in-built functions or any create functions inside a particular function这里打印Fun1.

对此的任何帮助都非常感谢.谢谢.

r function

4
推荐指数
2
解决办法
191
查看次数

列出函数中的函数

R中是否有一种方法可以列出给定函数中包含的函数?

例如,在下面的代码中:

myFun <- function(x) { 
  res <- list(m1=mean(x), s1=sd(x), mi=min(x))
  return(res)
}
Run Code Online (Sandbox Code Playgroud)

如何从函数myFun中提取所用函数的名称.在这种情况下,我想要一个带均值,sd和min的向量.

我想这样做而不必调用函数(否则Rprof()会完成这项工作).

r function

2
推荐指数
1
解决办法
80
查看次数

正则表达式,用于在函数体中查找函数调用

请将正文read.table视为文本文件,使用以下代码创建:

sink("readTable.txt")
body(read.table)
sink()
Run Code Online (Sandbox Code Playgroud)

使用正则表达式,我想找到表单的所有函数调用foo(a, b, c)(但有任意数量的参数)"readTable.txt".也就是说,我希望结果包含所有被调用函数的名称read.table.这包括表单的嵌套函数
foo(a, bar(b, c)).保留字(return,for使用反单引号(等)和功能'=='(),'+'()可以包含等),因为我可以在以后删除它们.

所以一般来说,我正在寻找模式text(或者text (可能的嵌套函数text1(text2(,但如果它是一个参数而不是函数,跳过文本.这是我到目前为止的地方.它很接近,但并不完全存在.

x <- readLines("readTable.txt")
regx <- "^(([[:print:]]*)\\(+.*\\))"
mat <- regexpr(regx, x)
lines <- regmatches(x, mat)
fns <- gsub(".*( |(=|(<-)))", "", lines)
head(fns, 10)
# [1] "default.stringsAsFactors()" "!missing(text))"
# [3] "\"UTF-8\")" "on.exit(close(file))" "(is.character(file))"
# [6] "(nzchar(fileEncoding))" "fileEncoding)" "\"rt\")"
# [9] "on.exit(close(file))" "\"connection\"))"
Run Code Online (Sandbox Code Playgroud)

例如,在 …

regex grep r

0
推荐指数
1
解决办法
1259
查看次数

可靠地从文本文件中提取R函数的名称

我想在我的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)
Run Code Online (Sandbox Code Playgroud)

测试对象包括八个函数(colnames,subset,max,as.factor,gsub,ifelse,str_detect,as.character),前两个函数两次.迭代一个匹配它们是:

(result <- unlist(strsplit(x = test, split = "\\(")))
 [1] "colnames"                               "x) <- subset"                          
 [3] "df, max"                                "y)"                                    
 [5] "sat <- as.factor"                       "gsub"                                  
 [7] "'International', 'Int'l', sat)))"       "score <- ifelse"                       
 [9] "str_detect"                             "as.character"                          
[11] "sat), 'Eval'), 'Importance', 'Rating')"
Run Code Online (Sandbox Code Playgroud)

然后,一系列手工制作的gsubs清除了这个特定测试集的结果,但是这些手动步骤无疑将落在其他较少设计的字符串上(我在下面提供一个).

(result <- gsub(" <- ", " ", gsub(".*\\)", "", gsub(".*,", "", perl = TRUE, …
Run Code Online (Sandbox Code Playgroud)

regex r

0
推荐指数
1
解决办法
514
查看次数

标签 统计

r ×6

function ×3

regex ×2

call-graph ×1

grep ×1