首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用for循环中的变量作为函数的输入

如何使用for循环中的变量作为函数的输入
EN

Stack Overflow用户
提问于 2020-06-09 16:21:49
回答 1查看 52关注 0票数 0

当我学习R的时候,我正试着把它用在我的工作中。我需要绘制142个曲线图并做一些统计。因此,我决定编写以下函数:

代码语言:javascript
复制
Melting <- function(df){
  i <- as.character(substitute(df))
  df.m<-melt(df)
  library(grid, lib.loc = "C:/Program Files/R/R-3.6.2/library")
  name_plot = paste(i,".png",sep = "")
  png(name_plot, width = 10, height = 9, units = 'in', res = 700)
  print(ggplot(data = df.m, aes(x=Tissuetype, y=value)) + geom_boxplot(aes(fill=variable)) + stat_compare_means(aes(group = variable), label = "p.signif") + theme(axis.text.x = element_text(angle = 90)))
  dev.off()
}

该函数运行良好,并将我的环境中存在的一个数据帧作为输入。例如:熔化(肝脏)在测试函数成功绘制图形后,我决定将其放入一个for循环中,就像我在bash脚本中所做的那样。但是,它会抛出以下错误:

代码语言:javascript
复制
for(i in names){Melting(i)}
 Error in FUN(X[[i]], ...) : object 'variable' not found 

名称向量的创建方式如下

代码语言:javascript
复制
files = list.files(pattern = "*.csv")
names <-tools::file_path_sans_ext(files)

我有一种预感,for循环中的i值正在被替换为字符串,例如:熔化(“肝脏”)而不是参数熔化(肝脏)。但我不知道该怎么克服它。我读了几篇帖子,但都不明白。请帮帮忙

EN

回答 1

Stack Overflow用户

发布于 2020-06-09 21:44:24

感谢@Valerifor帮助我,也感谢@Ronak。对于那些可能面临同样问题的人,最后的代码如下所示

代码语言:javascript
复制
#Reading multiple file list
files = list.files(pattern = "*.csv")


#first making a list of all data frames we wish to have
l <- as.list(tools::file_path_sans_ext(files))

#Loading all files as dataframes together
for(i in l){
  filepath <- file.path("E:/shantanu_new_tanta/tissue/facet_data/",paste(i,".csv",sep=""))
  assign(i, read.table(filepath,header = FALSE, col.names = c("Tissuetype", "E", "P"), sep = "\t"))
}

#Defining a function that plots boxplot with significance values
Melting <- function(df, name_png){
    df.m<-melt(df)
    library(grid, lib.loc = "C:/Program Files/R/R-3.6.2/library")
    name_plot = paste(name_png,".png",sep = "")
    png(name_plot, width = 10, height = 9, units = 'in', res = 700)
    print(ggplot(data = df.m, aes(x=Tissuetype, y=value)) + geom_boxplot(aes(fill=variable)) + stat_compare_means(aes(group = variable), label = "p.signif") + theme(axis.text.x = element_text(angle = 90)))
    dev.off()
}

#Running function on all files in a single go
for(i in 1:3){Melting(get(l[[i]]), l[[i]])}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62278119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档