получить имя из элемента списка r - PullRequest
1 голос
/ 22 сентября 2019

Как получить доступ к имени элемента списка внутри функции, если вы передаете не весь список, а только элемент списка (датафрейм)?

У меня есть именованный список фреймов данных, например,

files <- list(BRX = -0.72, BRY = -0.72, BRZ = -0.156, BTX = -0.002, BTY = -0.002, 
    BTZ = -0.0034)

Позже в коде я буду использовать один элемент списка в качестве входных данных для функции построения графика.Эта функция графика также должна печатать имя элемента списка.Как я могу получить к нему доступ?

У меня есть следующее решение - оно работает, но немного громоздко:

map2(files, names(files),
     function(file, filename) {
       data.table::setattr(file, "filename", filename)
     })

Позже я могу получить имя файла как атрибут в функции plot с помощью:

plotfunction(list_element, ...) {
...    
filename <- attr(input, "filename")
...
+ ggtitle(filename)
...
}

Существует ли более элегантное альтернативное решение, либо с помощью другого способа доступа к имени элемента списка, либо с помощью установки атрибута имени файла по-другому?

1 Ответ

0 голосов
/ 22 сентября 2019

Одним простым подходом может быть передача данных в функцию графика plot_fun в виде списка (с использованием одиночных скобок [), а не в качестве элемента списка (с использованием двойных скобок [[).Таким образом, имя элемента списка будет напрямую доступно внутри функции графика:

## dummy list of datasets
data_ls <- list(`Dataset 1` = data.frame(x = 1:10, y = 1:10), `Dataset 2` = data.frame(x = 1:10, y = 2 * (1:10)))

## dummy plot function
plot_fun <- function(data_el, ...) {
  plot(data_el[[1]], ...) + 
      title(names(data_el))
}

plot_fun(data_ls["Dataset 1"], type = "l")

plot_fun(data_ls[2], type = "l")


Редактировать: для вызова plot_fun для каждого элемента списка в data_ls, мы могли бы изменить plot_fun для принятия аргумента data и name, а затем вызвать lapply, Map, mapply или purrr walk2 или map2 (walk2 предпочтительнее, поскольку для его побочных эффектов требуется plot_fun).

## modified dummy plot function
plot_fun <- function(data, name, ...) {
  plot(data, ...) + 
      title(name)
}

## using lapply
lapply(seq_along(data_ls), function(i) plot_fun(data_ls[[i]], names(data_ls)[i], type = "l"))

## or with Map
Map(plot_fun, data = data_ls, name = names(data_ls), type = "l")

## or with purrr
purrr::walk2(.x = data_ls, .y = names(data_ls), .f = plot_fun, type = "l")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...