Параметризация имени выходного информационного кадра в глобальной среде, назначенного из функции - PullRequest
1 голос
/ 27 марта 2019

Пытаясь передать в функцию то, что я хочу, чтобы она назвала созданный им фрейм данных, а затем сохранить его в глобальной среде.

Я пытаюсь автоматизировать создание фреймов данных, которые являются подмножествами других фреймов данных, путем фильтрации длязначение;так как я создаю 43 из них, я пишу функцию, которая может автоматически:

  • a) подмножество строк, содержащих определенную строку, в свой собственный data.frame, затем
  • b.) назовите фрейм данных после этой строки и сохраните его в моей глобальной среде.(Строка в a) также является суффиксом, я хочу, чтобы он назвал data.frame после в b))

Я могу сделать а) хорошо, но у меня возникли проблемы с 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 сохраненным как data.frame в моей глобальной среде, когда я делаю это со строками, включающими термин Team.Curt

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Вы можете использовать assign для создания объектов на основе строки:

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

Здесь envir = .GlobalEnv используется для присвоения значения глобальной среде.

0 голосов
/ 27 марта 2019

Оба назначения <- и <<- требуют, чтобы оператор жестко кодировал имя объекта. Поскольку вы хотите параметризовать имя, как в ваших случаях, вы должны использовать assign().

<<- - это просто вариант <-, который можно использовать внутри функции и выполняет поиск окружений снизу вверх, пока он не достигнет вершины (.GlobalEnv) или не найдет существующий объект с таким именем. В вашем случае это не нужно и немного опасно, поскольку, если объект с таким именем существовал в некоторой среде на полпути вверх по иерархии, вы бы взяли его и присвоили ему.

Так что просто используйте assign(..., envir = .GlobalEnv) вместо.

Но как <<-, так и присвоение непосредственно в .GlobalEnv внутри функций настоятельно не рекомендуется, поскольку это приводит к бедствиям в ожидании или «жизни у вулкана» (burns-stat.com/pages/Tutor/R_inferno.pdf). См. Предостережения в Назначение нескольких объектов .GlobalEnv из функции . Tidyverse, вероятно, является лучшим подходом для управления несколькими фреймами данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...