R:如何使用名称和值取决于参数的函数创建对象,并且这些对象可以在全局环境中找到?

R : How to create objects with a function which name and value depend on an argument, and that these objects are found in the global environment?

我遇到以下情况:我有不同的数据帧,我希望能够根据其中一列的值(log2FoldChange>1 和 logFoldChange<-1)为每个数据帧创建 2 个数据帧.

为此,我使用以下代码:

DJ29_T0_Overexpr = DJ29_T0[which(DJ29_T0$log2FoldChange > 1),]
DJ29_T0_Underexpr = DJ29_T0[which(DJ21_T0$log2FoldChange < -1),]

DJ229_T0 是我的数据框之一。

第一个问题:未考虑 log2FoldChange < -1 的数据帧符号。

但是主要问题是在做函数的时候,我写了下面的:

spliteOverUnder <- function(res){
  nm <-deparse(substitute(res))
  assign(paste(nm,"_Overexpr", sep=""), res[which(as.numeric(as.character(res$log2FoldChange)) > 1),])
  assign(paste(nm,"_Underexpr", sep=""), res[which(as.numeric(as.character(res$log2FoldChange)) < -1),])
}

然后我 运行 与 :

spliteOverUnder(DJ29_T0)

没有错误消息,但我的对象没有导出到我的全局环境中。我尝试使用 return(paste(nm,"_Overexpr", sep="") 但它仅 returns 对象名称而不是关联的数据框。

使用paste()强制使用assign(),所以我不能这样做:

spliteOverUnder <- function(res){
  nm <-deparse(substitute(res))
  paste(nm,"_Overexpr", sep="") <<- res[which(as.numeric(as.character(res$log2FoldChange)) > 1),]
  paste(nm,"_Underexpr", sep="") <<- res[which(as.numeric(as.character(res$log2FoldChange)) < -1),]
}

spliteOverUnder(DJ24_T0)

我遇到以下错误:

Error in paste(nm, "_Overexpr", sep = "") <<- res[which(as.numeric(as.character(res$log2FoldChange)) > : 
  could not find function "paste<-"

如果您以前遇到过这个困难,我将不胜感激。 如果您知道,一旦该函数起作用,如何使用 For 循环遍历包含我所有数据帧的列表以将此函数应用于每个数据帧,我也是一个接受者。

谢谢

赋值时,使用pos参数将新对象提升到函数之外。

function(){
    assign(x = ..., value = ...,
           pos = 1 ## see below
    )
}

... 其中 0 = 函数的本地环境,1 = the environment next up(定义函数的地方)等

编辑 下面是在 全局环境 中创建拆分数据帧的通用函数。但是,您可能更愿意保存新的数据帧(从函数内部)或只是将它们转发给下游函数,而不是用中间对象塞满您的工作区。

splitOverUnder <- function(the_name_of_the_frame){
    df <- get(the_name_of_the_frame)
    df$cat <- cut(df$log2FoldChange,
                  breaks = c(-Inf, -1, 1, Inf),
                  labels = c('underexpr', 'normal', 'overexpr')
                  )
    split_data <- split(df, df$cat)
    sapply(c('underexpr', 'overexpr'),
           function(n){
               new_df_name <- paste(the_name_of_the_frame, n, sep = '_')
               assign(x = new_df_name,
                      value = split_data$n,
                      envir = .GlobalEnv
                      )
           }
           )
}

## say, df1 and df2 are your initial dataframes to split:
sapply(c('df1', 'df2'), function(n) splitOverUnder(n))