我正在使用GGally::ggpairs创建散点图矩阵。我正在使用自定义函数(以下称为my_fn)创建左下角的非对角子图。在调用该自定义函数的过程中,存在有关每个这些子图的信息,这些信息已计算出来,我想将其存储以备后用。

在下面的示例中,每个h@cID是具有100个值的int []结构。总共在my_fn中创建了10次(对于左下角的10个非对角子图中的每一个都创建一次)。我正在尝试将所有10个这些h@cID结构存储到listCID列表对象中。

我使用这种方法还没有成功,并且尝试了其他一些变体(例如,尝试将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


r - 在R中的映射函数中添加到列表对象-LMLPHP

最佳答案

如果我正确地理解了您的问题,那么使用<<-运算符就可以很容易地做到这一点,尽管非常困难。

使用它,您可以在函数范围内分配类似全局变量的内容。

在执行功能之前设置listCID <- NULL,在功能内部设置listCID <<-c(listCID,h@cID)

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
    }


有关作用域的更多信息,请参阅Hadleys出色的Advanced R:http://adv-r.had.co.nz/Environments.html

08-24 13:11