gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:35:07 26 4
gpt4 key购买 nike

我想创建一个函数 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

创建于 2020-02-16 由 reprex package (v0.3.0)

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

任何想法表示赞赏。

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

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

我将 check_syms 定义为:

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

它正确识别对 "!! sym" 进行函数调用的函数与仅调用例如 paste0("!!sym") 的函数相比.

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

test_f <- function(x) {
print(paste0("!!sym", x))
}

check_sym(foo)
#> [1] TRUE

check_sym(test_f)
#> [1] FALSE

最佳答案

base R ,我们可以捕获 body 的输出转换为字符串向量并使用 grepl

check_sym <- function(f)  any(grepl('!!sym(', capture.output(body(f)), fixed = TRUE))

check_sym(foo)
# [1] TRUE


some_fct <- function(x) print("sym")
check_sym(some_fct)
#[1] FALSE

关于r - 检查某个函数是否在 R 的嵌套函数中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60253619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com