使用get()函数结合<-运算符时出现错误的解决方法
问题:通过
get()调用带空格的数据框并修改列类型时出现could not find function "get<-"错误 问题场景
尝试在循环中通过paste0()拼接带空格的数据框名称,用get()调用后修改某一列的类型,代码如下:
get(paste0(Pathways$KEGG[1]," ",Pathways$PATHWAY[1]))$Kegg_Data<- as.character(get(paste0(Pathways$KEGG[1]," ",Pathways$PATHWAY[1]))$Kegg_Data)
单独执行get(paste0(Pathways$KEGG[1]," ",Pathways$PATHWAY[1]))$Kegg_Data或as.character(get(...))都正常,但赋值时触发错误:could not find function "get<-"
最小可复现示例(MRE)
- 创建3个带空格名称的数据框(实际数量可变):
# 创建数据框 `1 mtcars` <- data.frame(X = factor(c("123","456","789")), Kegg_Data = factor(c("qwe","asd","zxc"))) `3 motos` <- data.frame(X = factor(c("123","456","789")), Kegg_Data = factor(c("qwe","asd","zxc"))) `74 yates` <- data.frame(X = factor(c("123","456","789")), Kegg_Data = factor(c("qwe","asd","zxc")))
- 存储数据框名称的
dfnames数据框:
dfnames <- data.frame( digit = c("1","3","74"), letters = c("mtcars","motos","yates"), stringsAsFactors = FALSE )
- 循环修改列类型的代码:
for(j in seq_along(dfnames$digit)){ get(paste0(dfnames$digit[j]," ",dfnames$letters[j]))$Kegg_Data <- as.character(get(paste0(dfnames$digit[j]," ",dfnames$letters[j]))$Kegg_Data) }
核心问题:用get()调用带空格的数据框名称时,无法直接和<-赋值运算符配合使用。
解决方案
方法1:使用assign()先获取修改后的数据框再重新赋值
把数据框取出、修改列类型,再用assign()存回原名称的变量:
for(j in seq_along(dfnames$digit)){ # 拼接数据框名称 df_name <- paste0(dfnames$digit[j]," ",dfnames$letters[j]) # 获取数据框 temp_df <- get(df_name) # 修改列类型 temp_df$Kegg_Data <- as.character(temp_df$Kegg_Data) # 重新赋值回原变量 assign(df_name, temp_df) }
方法2:使用eval()和parse()构造赋值表达式
通过解析字符串表达式来完成赋值:
for(j in seq_along(dfnames$digit)){ df_name <- paste0(dfnames$digit[j]," ",dfnames$letters[j]) # 构造赋值字符串 expr_str <- paste0(df_name, "$Kegg_Data <- as.character(", df_name, "$Kegg_Data)") # 解析并执行表达式 eval(parse(text = expr_str)) }
方法3:推荐——将数据框存入列表统一管理(避免全局环境散落变量)
更规范的做法是把所有数据框放到一个列表里,这样无需处理带空格的变量名,操作更简洁:
# 把数据框存入列表(手动方式) df_list <- list( `1 mtcars` = `1 mtcars`, `3 motos` = `3 motos`, `74 yates` = `74 yates` ) # 或者自动从全局环境提取(按dfnames中的名称批量获取) df_list <- mget(paste0(dfnames$digit," ",dfnames$letters)) # 循环修改列表中的数据框 df_list <- lapply(df_list, function(df){ df$Kegg_Data <- as.character(df$Kegg_Data) return(df) }) # 可选:把修改后的数据框放回全局环境 list2env(df_list, envir = .GlobalEnv)
内容的提问来源于stack exchange,提问作者Alexander Rivero
相关产品推荐
相关产品推荐

