Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用Lappy保存使用列表中的名称从列表生成的绘图_R_Ggplot2 - Fatal编程技术网

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
循环。