【问题标题】:Parameterize name of output dataframe in global environment, assigned to from a function参数化全局环境中输出数据框的名称,从函数分配给
【发布时间】:2019-03-27 01:17:54
【问题描述】:

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

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

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

我可以做到 a) 很好,但在 b) 方面遇到了问题。

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

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

【问题讨论】:

  • 我试图重写问题以减少重复和冗长。本质上,您希望参数化要在assign 语句中使用的数据框的字符串名称,仅此而已。 (您也想在过滤操作中使用相同的字符串这一事实是无关紧要的。)但是您唯一的问题是您省略了assign(..., envir = .GlobalEnv)。而as.name(string) &lt;&lt;- ... 不是你做分配的方式。就是这样。
  • 你没有问的问题的答案是,如果你做了很多这样的事情,tidyverse 可能是一个更好的方法。

标签: r


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    &lt;-&lt;&lt;- 赋值都要求语句对对象名称进行硬编码。由于您想参数化名称,就像您的情况一样,您必须使用assign()

    &lt;&lt;- 只是&lt;- 的一个变体,可以在函数内部使用,并且对环境进行自下而上的搜索,直到它到达顶部(.GlobalEnv)或找到该名称的现有对象。在您的情况下,这是不必要且有点危险的,因为如果该名称的对象存在于层次结构中部的某个环境中,您会选择它并分配给它。

    所以请改用assign(..., envir = .GlobalEnv)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 2018-11-11
      • 2018-02-11
      • 1970-01-01
      相关资源
      最近更新 更多