尝试将要传递给函数的名称命名为创建的数据框,然后将其保存到全局环境中。
我正在尝试通过过滤值自动创建作为其他数据框子集的数据框;因为我正在创建其中的43个,所以我正在编写一个可以自动执行的功能:
我可以做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
答案 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可能是管理多个数据帧的更好方法。