Накопить изменения в элементах списка - PullRequest
0 голосов
/ 29 ноября 2018

Я создаю пакет, который позволяет пользователю импортировать файл Excel, и изменения вносятся в разные листы на основе столбцов в одном.Я добился этого, воспользовавшись правилами области видимости R.Ниже приведен чрезвычайно сокращенный и воспроизводимый пример:

require(tidyverse)

df <- data.frame(count = 1:3, 
                 number = 4:2)

commands <- data.frame(command = c("a", "a", "b"),
                      column = c("count", "count", "number"),
                      stringsAsFactors = F)

combo <- list(df = df, commands = commands)

commander <- function(x) {
   command_a <- function(column) {
      x$df <<- dplyr::mutate(x$df, !!column := !!sym(column) + 1)
   }

   command_b <- function(column) {
      x$df <<- dplyr::mutate(x$df, !!column := !!sym(column) - 1)
   }

   general_command <- function(comm, col) {
      if(comm == "a") {
         command_a(col)
      }
      else if (comm == "b") {
         command_b(col)
      }
   }

   purrr::pmap(list(x$commands$command,
                    x$commands$column),
               general_command)

   return(x)
}

commander(combo)

Это работает, но теперь я хочу иметь возможность очистить различные элементы этого списка (листы в Excel).В связи с этим и желанием иметь более читаемый / лучший код, я хочу переместить command_a и command_b, чтобы определить глобально.Однако я изо всех сил пытаюсь изменить фактический объект списка, переданный в функцию commander.

require(tidyverse)

df <- data.frame(count = 1:3, 
                 number = 4:2)

commands <- data.frame(command = c("a", "a", "b"),
                       df = c("df", "df", "df"),
                      column = c("count", "count", "number"),
                      stringsAsFactors = F)

combo <- list(df = df, commands = commands)

command_a <- function(df, column) {
   df <- dplyr::mutate(df, !!column := !!sym(column) + 1)
}

command_b <- function(df, column) {
   df <- dplyr::mutate(df, !!column := !!sym(column) - 1)
}

commander <- function(x) {
   general_command <- function(comm, df, col) {
      if(comm == "a") {
         command_a(x[[df]], col)
      }
      else if (comm == "b") {
         command_b(x[[df]], col)
      }
   }

   purrr::pmap(list(x$commands$command,
                    x$commands$df,
                    x$commands$column),
               general_command)
   return(x)
}

commander(combo)

Я застрял в этой последней точке.Как я могу использовать pmap или что-то еще, чтобы аналогичным образом отобразить эти команды в списке, но накапливать изменения?Я думал об использовании чего-то вроде накопления таким образом, но, очевидно, не удается, поскольку дополнительные аргументы не отображаются, поэтому не могут быть векторами.

general_command <- function(list, comm, df, col) {
   if(comm == "a") {
      command_a(list[[df]], col)
   }
   else if (comm == "b") {
      command_b(list[[df]], col)
   }
}

commander <- function(x) {
   purrr::accumulate(x,
                    general_command,
                    x$commands$command,
                    x$commands$df,
                    x$commands$column)
   return(x)
}

Любая помощь будет принята с благодарностью!

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