在R中另一个较低函数内部更改函数变量的问题?

时间:2017-10-29 16:30:23

标签: r environment-variables

我需要从目录中打开文件(矩阵)并在每个目录上应用函数 pca 。它使用另一个函数 count_pc ,它被认为是逐步在矩阵中对齐的对角线,并将重新计算的PC1添加到上一个函数的表 pcs 中。一开始,我没有想到环境,所以 count_pca 因错误“未知变量”而崩溃。然后我试着这样做:

files <- list.files()

count_pc <- function(x, env = parent.frame()) {
  diag(file[x:nrow(file),]) <- 0
  diag(file[,x:nrow(file)]) <- 0
  pcn <- prcomp(file, scale = FALSE)
  pcn <- data.frame(pcn$rotation)
  pcs <- cbind(pcs, pcn$PC1)
}

pca <- function(filename) {
  file <- as.matrix(read.table(filename))
  pc <- prcomp(file, scale = FALSE)
  pc <- data.frame(pc$rotation)
  pc1 <- pc$PC1
  pcs <- data.frame(pc1)
  for (k in 1:40) {
    count_pc(k)
  }
  new_filename <- strsplit(filename, "_")[[1]][3]
  print(pcs)
  colnames(pcs) <- paste0(0:40, rep("_bins_deleted", 40))
  write.table(pcs, file=paste(new_filename, "eigenvectors", sep="_"))
  return(apply(pcs, 2, cor, y = pc1))
}

ldply(files, pca)

事实上, count_pc 不会因上述错误而崩溃,但不幸的是,它会因新错误而崩溃:

"colnames<-`(`*tmp*`, value = c("0_bins_deleted", "1_bins_deleted",  :
'names' [41] attribute must be the same length as the vector [1]"

表示 count_pc 不会更改所需的变量。首先,我认为问题可能与使用sapply(1:40, count_pc)有关,所以我用循环替换它。但它没有帮助。我还尝试在 pca 中使用environment(count_pc) <- environment(),但它也没有帮助(以及将 count_pc 中的变量名称更改为env $'名称“)。我不知道该怎么做,谷歌搜索似乎没有帮助。

0 个答案:

没有答案