Я думаю, что split
делает именно то, что вы хотите.
Обратите внимание, что X - это список кадров данных, как видно из str
:
X <- split(df, df$g)
str(X)
вы хотите, чтобы отдельный объект с именами группы g вы могли присваивать элементам X из split
объектам этих имен, хотя это кажется дополнительной работой, когда вы можете просто индексировать кадры данных из списка split
.
#I used lapply just to drop the third column g which is no longer needed.
Y <- lapply(seq_along(X), function(x) as.data.frame(X[[x]])[, 1:2])
#Assign the dataframes in the list Y to individual objects
A <- Y[[1]]
B <- Y[[2]]
C <- Y[[3]]
D <- Y[[4]]
E <- Y[[5]]
#Or use lapply with assign to assign each piece to an object all at once
lapply(seq_along(Y), function(x) {
assign(c("A", "B", "C", "D", "E")[x], Y[[x]], envir=.GlobalEnv)
}
)
Изменить Или даже лучше, чем использовать lapply
для назначения глобальной среде использования list2env
:
names(Y) <- c("A", "B", "C", "D", "E")
list2env(Y, envir = .GlobalEnv)
A
Все, что вам нужно сделать, это вернуть File
:
public IActionResult SampleFileReport()
{
// do stuff
return File(bytes, mimetype, filename);
}
File
также имеет перегрузки, которые принимают Stream
и string
(путь и имя файла к файлу в файловой системе) в дополнение к byte[]
. mimetype
- это ваш тип контента, например, application/pdf
, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
(Excel) и т. Д. Последний параметр filename
является необязательным. Если он предоставлен, заголовок Content-Disposition: attachment
отправляется с ответом, который предлагает браузеру открыть диалоговое окно загрузки. В противном случае используется значение по умолчанию Content-Disposition: inline
, и браузер будет пытаться загрузить возвращаемый файл непосредственно во вкладку / окно браузера, предполагая, что mime-тип поддерживается для нативного рендеринга браузера. Если нет, то вы получите диалог загрузки, независимо от того.