在全局环境中参数化输出数据框的名称,该名称是通过函数分配的

时间:2019-03-27 01:17:55

标签: r

尝试将要传递给函数的名称命名为创建的数据框,然后将其保存到全局环境中。

我正在尝试通过过滤值自动创建作为其他数据框子集的数据框;因为我正在创建其中的43个,所以我正在编写一个可以自动执行的功能:

  • a)将包含某个字符串的子集行放入其自己的data.frame中,然后
  • b)在该字符串之后命名一个数据框,然后将其保存到我的全局环境中。 (a中的字符串)也是我希望它在b)之后命名为data.frame的后缀)

我可以做a)很好,但是在b)上遇到了麻烦。

说我有一个数据集,其中包括一个名为“ Team”的列(详细说明该成员所属的团队):

original.df <- read_csv("../original_data_set")

我创建了一个函数,用于根据其中一列中的值拆分该数据集...

split.function <- function(string){
    x <- original.df
    as.name(string) <<- filter(x, str_detect(`Team`, string))
}

...然后使用以下名称保存数据框:

split.by.candidate('Team.Curt')

我不断得到:

> Error in as.name(x) <<- filter(y, str_detect(`Receiving Committee`, x)) : 
  object 'x' not found

但是当我对包含术语Team.Curt的行执行此操作时,我只是想将Team.Curt保存为全局环境中的data.frame

2 个答案:

答案 0 :(得分:1)

您可以使用assign基于字符串创建对象:

split.function <- function(string){
   x <- original.df
   assign(string, filter(x, str_detect(`Team`, string)), envir = .GlobalEnv)
}

在这里,envir = .GlobalEnv用于将值分配给全局环境。

答案 1 :(得分:0)

<-<<-的分配都要求该语句对对象名称进行硬编码。由于要像在您的情况下一样对名称进行参数化,因此必须使用assign()

<<-只是<-的变体,可以在函数内部使用,并且对环境进行自底向上搜索,直到到达顶部(.GlobalEnv)或找到现有对象为止这个名字的。在您的情况下,这是不必要的,并且有些危险,因为如果该名称的对象存在于层次结构中途的某个环境中,则可以将其拾取并分配给它。

所以只需使用assign(..., envir = .GlobalEnv)

强烈建议不要将<<-或直接分配给函数中的.GlobalEnv都视为等待中的灾难或“火山爆发的生命”(burns-stat.com/pages/Tutor/R_inferno.pdf)。请参见Assign multiple objects to .GlobalEnv from within a function的警告。 tidyverse可能是管理多个数据帧的更好方法。