Я создаю пакет, который позволяет пользователю импортировать файл 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)
}
Любая помощь будет принята с благодарностью!