如何用R基础函数获取环境中函数参数及对应打印函数?
关于R中函数信息提取与打印函数的问题
问题背景
用户想要构建一个包含指定环境中所有函数、函数参数等信息的数据框,示例如下:
fun args uses_arg 1 myfun function (x, w=1) function (x, arg)
对应的R代码示例:
myfun <- function(x, w=1) return(x * w) lsf.str() # myfun : function (x, w) # info from lsf.str(). # uses_arg : function (x, arg) lsf_text <- lsf.str() class(lsf_text) # [1] "ls_str" # class. print.default(lsf_text) # print as is. # [1] "myfun" # attr(,"envir") # <environment: R_GlobalEnv> # attr(,"mode") # [1] "function" # print class print(lsf_text) # myfun : function (x, w) # <<<<<<<<<<<< # uses_arg : function (x, arg)# <<<<<<<<<<<< #-------------------------------------------
提出的问题
- 如何使用R基础函数获取冒号后的函数参数定义(如
"function (x, w)")? - 如何找到
print(lsf_text)所使用的实际打印函数?
问题1解答
可以通过基础函数组合实现,步骤如下:
- 先用
lsf.str()获取目标环境中的函数名列表(返回的ls_str类对象本质是带环境属性的字符向量)。 - 遍历每个函数名,通过
get()获取对应的函数对象,再用formals()提取参数列表,最后拼接成需要的格式字符串。
示例代码(含默认值的完整参数定义)
# 获取环境中的函数名 fun_names <- lsf.str() # 遍历提取每个函数的参数定义 args_defs <- sapply(fun_names, function(f) { # 从对应环境中获取函数对象 fun_obj <- get(f, envir = attr(fun_names, "envir")) # 获取参数列表 fun_args <- formals(fun_obj) # 拼接参数名与默认值 args_str <- paste(names(fun_args), sapply(fun_args, function(arg) { if (!is.symbol(arg)) paste("=", deparse(arg), collapse = "") else "" }), collapse = ", ") # 组合成目标格式 paste0("function (", args_str, ")") }) # 构建数据框 result_df <- data.frame(fun = fun_names, args = args_defs, stringsAsFactors = FALSE)
运行后result_df中myfun对应的args会是function (x, w = 1),符合数据框示例的完整格式。
简化版(仅参数名,无默认值)
如果只需要lsf.str()打印的简洁格式,可简化代码:
args_defs_simple <- sapply(fun_names, function(f) { fun_obj <- get(f, envir = attr(fun_names, "envir")) paste0("function (", paste(names(formals(fun_obj)), collapse = ", "), ")") })
问题2解答
因为lsf_text的类是"ls_str",R会调用针对该类的S3打印方法,可通过以下方式找到实际函数:
- 查看所有print方法:运行
methods(print),在结果中找到带ls_str后缀的方法(即print.ls_str)。 - 直接获取方法定义:用
getS3method("print", "ls_str")直接提取该函数的代码,示例:
# 获取print.ls_str函数 print_ls_str <- getS3method("print", "ls_str") # 查看函数内容 print(print_ls_str)
- 调试验证:执行
debugonce(print)后调用print(lsf_text),调试过程中会看到实际调用的方法路径。
内容的提问来源于stack exchange,提问作者clp
相关产品推荐
相关产品推荐

