在R中提取函数变量并确定其所属环境的实现方案
问题:列出函数体变量及其所属环境
示例场景
以下是包含自定义环境变量的函数示例:
g2 <- function() { print(cc) print(dd) print(ee) } e <- new.env(parent = globalenv()) e$cc <- "Hello from the new environment" e$dd <- "Hello from the new environment2" environment(g2) <- e e2 <- new.env(parent = globalenv()) e2$dd <- "Hello from the new environment" e2$ee <- "Hello from the new environment2" environment(g2) <- e2
当前进展
已完成以下步骤:
- 提取函数中的变量:
symbols <- c("cc","dd","ee") - 获取当前环境中的所有自定义环境:
envirs <- ls()[sapply(ls(), function(x) is.environment(get(x)))] - 检查每个变量在各环境中的存在性,得到矩阵
xin:
xin <- sapply(envirs, function(x) sapply(symbols, function(y) exists(y,get(x))))
输出结果:
> xin e e2 cc TRUE FALSE dd TRUE TRUE ee FALSE TRUE
各环境的标识:
> e <environment: 0x00000127b2a1e1a8> > e2 <environment: 0x00000127b2a20988>
期望输出
希望得到如下格式的结果:
Symbol Definition 1 cc <environment: 0x00000127b2a1e1a8> 2 dd <environment: 0x00000127b2a1e1a8>, <environment: 0x00000127b2a20988> 3 ee <environment: 0x00000127b2a20988>
解决方案(Base R实现)
通过遍历变量匹配对应环境,拼接环境标识字符串即可实现:
# 遍历每个变量,获取其存在的环境的字符串标识 env_str_list <- lapply(symbols, function(sym) { # 筛选当前变量存在的环境名称 target_envs <- envirs[xin[sym, ]] # 转换环境为字符串格式 sapply(target_envs, function(env_name) capture.output(print(get(env_name)))) }) # 拼接每个变量的环境字符串 definitions <- sapply(env_str_list, function(x) paste(x, collapse = ", ")) # 生成目标数据框 result_df <- data.frame( Symbol = symbols, Definition = definitions, row.names = NULL ) print(result_df)
运行上述代码即可得到期望的输出格式。
内容的提问来源于stack exchange,提问作者KacZdr
相关产品推荐
相关产品推荐

