R 使用Lappy保存使用列表中的名称从列表生成的绘图
我有一个数据表列表,每个表都包含相同格式的数据,并且每个表都有一个唯一的名称。示例如下:R 使用Lappy保存使用列表中的名称从列表生成的绘图,r,ggplot2,R,Ggplot2,我有一个数据表列表,每个表都包含相同格式的数据,并且每个表都有一个唯一的名称。示例如下: > head(list$table1) gene logFC negLogPval 1 CROT -1.546082 6.405688 2 CASC15 -1.718302 5.501062 3 ITGA8 -2.839048 5.159019 4 LDB2 -1.258781 4.646456 5 PTGS1
> head(list$table1)
gene logFC negLogPval
1 CROT -1.546082 6.405688
2 CASC15 -1.718302 5.501062
3 ITGA8 -2.839048 5.159019
4 LDB2 -1.258781 4.646456
5 PTGS1 1.009361 3.791273
6 FABP5 -1.186742 3.189549
我想从列表中的每个数据表中绘制一个单独的绘图,然后保存,我可以使用以下功能执行此操作:
volc = function(input){
ggplot(input, aes(logFC, negLogPval)) +
geom_point()
ggsave(paste0("Volcano_", names(input), ".png"), device = "png")
}
如果我在单个数据表上运行此操作,如下所示:
volc(list$table1)
lapply(list, volc)
然后,它会按预期生成一个绘图,但不会使用对象的名称来命名文件,而是使用数据表中第一列的名称,即将文件保存为“Volcano_gene.png”而不是“Volcano_table1.png”
这意味着如果我使用lappy
在我的数据表列表上运行此操作,如下所示:
volc(list$table1)
lapply(list, volc)
它在每个表上运行代码,但将所有表保存为“Volcano_gene.png”,在运行时覆盖上一个表,这意味着唯一保存的绘图是最后生成的绘图
我确信我缺少了
names()
函数的一些简单功能,但是有人能帮我解决这个问题吗,这样它就可以按预期的名称保存绘图了?您不需要该列表中data.frames的列名,而需要它们的名称,即names(list)
。我建议重复这些名称:
volc = function(inputname){
ggplot(list[[inputname]], aes(logFC, negLogPval)) +
geom_point()
ggsave(paste0("Volcano_", inputname, ".png"), device = "png")
}
for (x in names(list)) volc(x)
您不需要该列表中data.frames的列名,但需要它们的名称,即
名称(列表)
。我建议重复这些名称:
volc = function(inputname){
ggplot(list[[inputname]], aes(logFC, negLogPval)) +
geom_point()
ggsave(paste0("Volcano_", inputname, ".png"), device = "png")
}
for (x in names(list)) volc(x)
代码的问题在于,当您将函数应用于
列表中的每个data.frame
时,名称(输入)
会给出data.frame
的列名。看看这个例子
data(mtcars)
l = list()
l$a = mtcars[, 1:2]
l$b = mtcars[, 2:3]
lapply(l, names)
$a
[1] "mpg" "cyl"
$b
[1] "cyl" "disp"
若要解决此问题,请将函数更改为采用第二个参数名称
volc = function(input, name) {
ggplot(input, aes(logFC, negLogPval)) +
geom_point()
ggsave(paste0("Volcano_", name, ".png"), device = "png")
}
现在,您可以使用Map
来构建您的目标:
Map(volc, list, names(list))
代码的问题在于,当您将函数应用于列表中的每个data.frame
时,名称(输入)
会给出data.frame
的列名。看看这个例子
data(mtcars)
l = list()
l$a = mtcars[, 1:2]
l$b = mtcars[, 2:3]
lapply(l, names)
$a
[1] "mpg" "cyl"
$b
[1] "cyl" "disp"
若要解决此问题,请将函数更改为采用第二个参数名称
volc = function(input, name) {
ggplot(input, aes(logFC, negLogPval)) +
geom_point()
ggsave(paste0("Volcano_", name, ".png"), device = "png")
}
现在,您可以使用Map
来构建您的目标:
Map(volc, list, names(list))
如果您想要一些漂亮的火山图,请参阅package。我会检查它,我一直在玩用阈值等手动着色我的图,我只是把它们从示例代码中删除了。不过,这可能是一个更简单的方法!如果您想要一些漂亮的火山图,请参阅package。我会检查它,我一直在玩用阈值等手动着色我的图,我只是把它们从示例代码中删除了。不过,这可能是一个更简单的方法!啊,我明白了。names(list)
将names()
函数应用于列表中的各个数据表,而不是列表本身。使用lappy
而不是for
循环是否有类似的方法?我通常使用lappy
,因为我更喜欢语法,但是在这种情况下,for
可能更容易。如果你像这里那样纯粹为了副作用调用函数,那么for
循环是合适的构造。也许我误解了术语,但是这个示例是如何使用它来处理副作用的?调用ggplot
的功能是绘制绘图,调用names()
的功能是提供列表中项目的名称。正当我不熟悉编码,所以可能副作用与我习惯的有不同的含义?保存文件和绘制绘图是副作用,而不是返回值。嗯,好的,这似乎不明显,但谢谢。我最后还试着运行你的版本,看看它是否和Tommy的Map()版本一样好,但它返回时出现了以下错误:列表中的错误[[inputname]]:类型为“builtin”的对象不可子集
编辑:没关系,我几乎一发布就自己解决了,我忘了将“list”重命名为我的实际列表名。啊,我明白了。names(list)
将names()
函数应用于列表中的各个数据表,而不是列表本身。使用lappy
而不是for
循环是否有类似的方法?我通常使用lappy
,因为我更喜欢语法,但是在这种情况下,for
可能更容易。如果你像这里那样纯粹为了副作用调用函数,那么for
循环是合适的构造。也许我误解了术语,但是这个示例是如何使用它来处理副作用的?调用ggplot
的功能是绘制绘图,调用names()
的功能是提供列表中项目的名称。正当我不熟悉编码,所以可能副作用与我习惯的有不同的含义?保存文件和绘制绘图是副作用,而不是返回值。嗯,好的,这似乎不明显,但谢谢。我最后还试着运行你的版本,看看它是否和Tommy的Map()版本一样好,但它返回时出现了以下错误:列表中的错误[[inputname]]:类型为“builtin”的对象不可子集
编辑:没关系,我几乎一发布就自己解决了,我忘了将“list”重命名为我的实际列表名。我明白了,谢谢你的帮助。在我读这篇文章之前,我已经回复了罗兰,但是这是一种更好的方法,可以在整个列表中完成,而不必使用for
循环。我明白了,谢谢你的帮助。在我读这篇文章之前,我对罗兰做出了回应,但这是一种更好的方法,可以在整个列表中使用它,而不必使用for
循环。