添加到R中映射函数中的列表对象

添加到R中映射函数中的列表对象,r,ggplot2,data-visualization,ggally,R,Ggplot2,Data Visualization,Ggally,我正在使用GGally::ggpairs创建散点图矩阵。我正在使用一个自定义函数(下面称为my_fn)来创建左下角的非对角子批次。在调用该自定义函数的过程中,有关于每个子批的信息,这些信息都是经过计算的,我希望以后存储这些信息 在下面的示例中,每个h@cID是具有100个值的int[]结构。总的来说,它在my_fn中创建了10次(左下角的10个非对角子批次各创建一次)。我正在尝试存储所有10个h@cID构造到listCIDlist对象中 我没有成功地使用这种方法,我也尝试了一些其他变体(例如尝试

我正在使用
GGally::ggpairs
创建散点图矩阵。我正在使用一个自定义函数(下面称为
my_fn
)来创建左下角的非对角子批次。在调用该自定义函数的过程中,有关于每个子批的信息,这些信息都是经过计算的,我希望以后存储这些信息

在下面的示例中,每个
h@cID
是具有100个值的int[]结构。总的来说,它在my_fn中创建了10次(左下角的10个非对角子批次各创建一次)。我正在尝试存储所有10个
h@cID
构造到
listCID
list对象中

我没有成功地使用这种方法,我也尝试了一些其他变体(例如尝试将
listCID
作为
my_fn
的输入参数,或者尝试在最后返回它)

我可以存储十个
h@cID
通过
my\fn
高效地构建,以便以后使用?我觉得有几个我并不完全熟悉的语法问题可以解释我为什么会被卡住,同样,如果我没有使用合适的术语,我也很乐意更改这个问题的标题。谢谢大家!

library(hexbin)
library(GGally)
library(ggplot2)

set.seed(1)

bindata <- data.frame(
    ID = paste0("ID", 1:100), 
    A = rnorm(100), B = rnorm(100), C = rnorm(100), 
    D = rnorm(100), E = rnorm(100))
    bindata$ID <- as.character(bindata$ID
)

maxVal <- max(abs(bindata[ ,2:6]))
maxRange <- c(-1 * maxVal, maxVal)

listCID <- c()

my_fn <- function(data, mapping, ...){
  x <- data[ ,c(as.character(mapping$x))]
  y <- data[ ,c(as.character(mapping$y))]
  h <- hexbin(x=x, y=y, xbins=5, shape=1, IDs=TRUE, 
              xbnds=maxRange, ybnds=maxRange)
  hexdf <- data.frame(hcell2xy(h),  hexID=h@cell, counts=h@count)
  listCID <- c(listCID, h@cID)
  print(listCID)
  p <- ggplot(hexdf, aes(x=x, y=y, fill=counts, hexID=hexID)) + 
            geom_hex(stat="identity")
  p
}

p <- ggpairs(bindata[ ,2:6], lower=list(continuous=my_fn))
p
库(hexbin)
图书馆(GGALY)
图书馆(GG2)
种子(1)

bindata如果我正确理解了您的问题,那么使用
可以很容易地实现这一点,尽管不是很好。通常,尝试用一个函数返回两个不同的结果不是一个好的做法。在本例中,您希望返回绘图和计算结果(hexbin cIDs)

最好是分步计算结果。每一步都是一个单独的功能。然后,第一个函数的结果(计算hexbins)可以用作多个后续函数(查找CID并创建绘图)的输入。下面是重构代码的多种方法之一:

  • calc_hexbins(),在其中生成所有hexbins。此函数可以返回已命名的hexbin列表(例如,list(AB=h1,AC=h2,BC=43))。这是通过列举列表中所有可能的组合(A、B、C、D和E)来实现的。缺点是复制了ggpairs()中已有的一些逻辑
  • gen_cids()将hexbins作为输入并生成所有CID。这是一个简单的操作,您在列表中的所有元素上循环(或lappy)并获取cID
  • create_plot()还将hexbins作为输入,这是实际生成绘图的函数。在这里,您可以为hexbin列表添加一个额外的参数(在您的包中有一个函数wrap()可以执行此操作)。不必计算hexbin,您可以通过将A和B组合成字符串,在前面生成的命名列表中查找它们

这避免了诸如处理属性或使用全局变量之类的老套方法。这些当然可以,但在维护代码时经常会让人头疼。不幸的是,这也会使代码变长一些,但这可能是一件好事。

您可以将额外的信息添加为属性。所以在行
hexdf之后
listCID = NULL

my_fn <- function(data, mapping, ...){
  x = data[,c(as.character(mapping$x))]
  y = data[,c(as.character(mapping$y))]
  h <- hexbin(x=x, y=y, xbins=5, shape=1, IDs=TRUE, xbnds=maxRange, ybnds=maxRange)
  hexdf <- data.frame (hcell2xy (h),  hexID = h@cell, counts = h@count)

  if(exists("listCID")) listCID <<-c(listCID,h@cID)

  print(listCID)
  p <- ggplot(hexdf, aes(x=x, y=y, fill = counts, hexID=hexID)) + geom_hex(stat="identity")
  p
    }