我的Shiny应用程序中有一个部分可以生成列表。
列表的名称是我们将基于dataframe
计算的列名称,
列表项包含我们想要的计算
希望这样做:
apply
到所有list
的名称:
为listname
(column
)x在function
上计算n,m,o
df column
x
并将结果列命名为'x.n
',即'cyl.mean'
,'mpg.sum
'
在这种情况下,可以获取dataframe
个汇总统计信息PER GROUP(mtcars $ cyl)
它与this问题相关,但是示例data
在list
名称中使用了单独的column
,而apply
使用了相同的{{1 }}来自其他functions
的所有columns
。我希望将list
的{{1}} apply
组转移到不同的unique
我的应用程序弹出的列表如下:
functions
预期输出:
columns
创建列表的闪亮小应用程序:
mylist
$disp
[1] "sum" "mean"
$hp
[1] "sd"
$drat
[1] "sum" "mean"
$wt
[1] "max"
答案 0 :(得分:1)
如果我理解正确,那么问题首先不是关于shiny,而是关于如何将不同的聚合函数应用于data.table的特定列。
列名和要应用的功能以列表mylist
的形式给出,该列表由闪亮的应用程序创建。
在各种方法中,我首选的方法是根据语言进行计算,即根据mylist
的内容创建完整的表达式并对其进行评估:
library(magrittr)
library(data.table)
mylist %>%
names() %>%
lapply(
function(.col) lapply(
mylist[[.col]],
function(.fct) sprintf("%s.%s = %s(%s)", .col, .fct, .fct, .col))) %>%
unlist() %>%
paste(collapse = ", ") %>%
sprintf("as.data.table(mtcars)[, .(%s), by = cyl]", .) %>%
parse(text = .) %>%
eval()
产生预期的结果
cyl disp.sum disp.mean hp.sd drat.sum drat.mean wt.max 1: 6 1283.2 183.3143 24.26049 25.10 3.585714 3.460 2: 4 1156.5 105.1364 20.93453 44.78 4.070909 3.190 3: 8 4943.4 353.1000 50.97689 45.21 3.229286 5.424
被解析的字符串由
创建mylist %>%
names() %>%
lapply(
function(.col) lapply(
mylist[[.col]],
function(.fct) sprintf("%s.%s = %s(%s)", .col, .fct, .fct, .col))) %>%
unlist() %>%
paste(collapse = ", ") %>%
sprintf("as.data.table(mtcars)[, .(%s), by = cyl]", .)
,看起来好像是手动编码的:
[1] "as.data.table(mtcars)[, .(disp.sum = sum(disp), disp.mean = mean(disp), hp.sd = sd(hp), drat.sum = sum(drat), drat.mean = mean(drat), wt.max = max(wt)), by = cyl]"
为演示起见,mylist
被“硬编码”:
mylist <- list(
disp = c("sum", "mean"),
hp = "sd",
drat = c("sum", "mean"),
wt = "max")