无法在闪亮的应用程序中的 lapply 函数中使用应用函数
Unable to use apply function inside an lapply function in a shiny app
此代码 returns 每列中的一些响应不适用。
apply(df, 2, function(x) sum(!is.na(x)))
我还制作了一个应用程序,它使用 IRIS 数据集的 'species' 列将其拆分为 3 个部分。然后显示 3 个部分。我们可以真正使用任何数据,并根据某些列将其拆分为多个部分。
但是,我还想计算 3 个数据集中每列中的响应数,但我不确定该怎么做。我尝试了以下及其变体,但我失败了。我想我还需要使用 subset(x,select=-c(Species)) 从数据集中对物种列进行子集化,但我现在真的很困惑我将如何实现这一切。这是我正在进行的项目的最后一个方面,我真的需要一些帮助:-
以下是将数据分成3部分并显示的代码:-
library(shiny) data(iris)
server<- shinyServer(
function(input, output) {
output$data <- renderUI({
splitDFs<- split(iris, iris$Species)
lapply(splitDFs, function(x) renderTable(x))
})
} )
ui<- shinyUI(fluidPage( titlePanel(title = h4("Iris Dataset", align="center")), sidebarLayout( sidebarPanel( ),
mainPanel(
uiOutput("data"),
)
)
))
shinyApp(ui = ui, server = server)
以下是我到目前为止尝试过的方法。我尝试了以下代码的各种变体,但都失败了:-
output$data <- renderUI({
splitDFs<- split(iris, iris$Species)
lapply(splitDFs, function(x) apply(splitDFs, 2, function(x) sum(!is.na(x)))(x) )
})
这就是你想要的吗?
lapply(splitDFs, function(y) apply(y, 2, function(x) sum(!is.na(x))))
为清楚起见,更好的想法是将内部 apply
存储为单独的函数:
sum.DF <- function(df) apply(df, 2, function(x) sum(!is.na(x)))
lapply(splitDFs, sum.DF)
VitaminB16 的答案提供了您所需要的,因此您需要弄清楚您想要如何表示它。
例如,如果您在服务器中使用以下代码(稍微调整一下 VitaminB16 的回答):
output$data <- renderUI({
splitDFs<- split(iris, iris$Species)
sP <- data.frame(t(sapply(splitDFs, function(x) sapply(x, function(y) sum(!is.na(y))))))
sP <- cbind(data.frame(Metric = rownames(sP)), sP)
sP2 <- renderTable(sP)
return(list(sP2))
})
你明白了:
在这里,每一行是数据中的一个拆分,每一列是原始数据集中的一列。单元格表示该组合中非缺失值的数量。
拆分功能和以前一样。
然后我们先像Vitamin那样使用nested apply来计算
横截面非 NA 计数。
- 我们使用 sapply 而不是 lapply 来获得矩阵输出而不是
列出输出,因此我们可以轻松地强制转换为数据帧。
在强制转换之前,我们转置,所以列仍然是列(你可以
如果你愿意,可以试试这个)。
然后,我们将行名称添加为显式列。我们这样做
通过 cbind,否则 Metric 列将位于末尾。
然后,我们将其放入 renderTable 中并传回。
- 请注意,由于现在只有一个 table,您可以使用 renderTable
并且table直接输出而不用担心renderUI和
uiOutput.
此代码 returns 每列中的一些响应不适用。
apply(df, 2, function(x) sum(!is.na(x)))
我还制作了一个应用程序,它使用 IRIS 数据集的 'species' 列将其拆分为 3 个部分。然后显示 3 个部分。我们可以真正使用任何数据,并根据某些列将其拆分为多个部分。 但是,我还想计算 3 个数据集中每列中的响应数,但我不确定该怎么做。我尝试了以下及其变体,但我失败了。我想我还需要使用 subset(x,select=-c(Species)) 从数据集中对物种列进行子集化,但我现在真的很困惑我将如何实现这一切。这是我正在进行的项目的最后一个方面,我真的需要一些帮助:-
以下是将数据分成3部分并显示的代码:-
library(shiny) data(iris)
server<- shinyServer(
function(input, output) {
output$data <- renderUI({
splitDFs<- split(iris, iris$Species)
lapply(splitDFs, function(x) renderTable(x))
})
} )
ui<- shinyUI(fluidPage( titlePanel(title = h4("Iris Dataset", align="center")), sidebarLayout( sidebarPanel( ),
mainPanel(
uiOutput("data"),
)
)
))
shinyApp(ui = ui, server = server)
以下是我到目前为止尝试过的方法。我尝试了以下代码的各种变体,但都失败了:-
output$data <- renderUI({
splitDFs<- split(iris, iris$Species)
lapply(splitDFs, function(x) apply(splitDFs, 2, function(x) sum(!is.na(x)))(x) )
})
这就是你想要的吗?
lapply(splitDFs, function(y) apply(y, 2, function(x) sum(!is.na(x))))
为清楚起见,更好的想法是将内部 apply
存储为单独的函数:
sum.DF <- function(df) apply(df, 2, function(x) sum(!is.na(x)))
lapply(splitDFs, sum.DF)
VitaminB16 的答案提供了您所需要的,因此您需要弄清楚您想要如何表示它。
例如,如果您在服务器中使用以下代码(稍微调整一下 VitaminB16 的回答):
output$data <- renderUI({
splitDFs<- split(iris, iris$Species)
sP <- data.frame(t(sapply(splitDFs, function(x) sapply(x, function(y) sum(!is.na(y))))))
sP <- cbind(data.frame(Metric = rownames(sP)), sP)
sP2 <- renderTable(sP)
return(list(sP2))
})
你明白了:
在这里,每一行是数据中的一个拆分,每一列是原始数据集中的一列。单元格表示该组合中非缺失值的数量。
拆分功能和以前一样。
然后我们先像Vitamin那样使用nested apply来计算 横截面非 NA 计数。
- 我们使用 sapply 而不是 lapply 来获得矩阵输出而不是 列出输出,因此我们可以轻松地强制转换为数据帧。
在强制转换之前,我们转置,所以列仍然是列(你可以 如果你愿意,可以试试这个)。
然后,我们将行名称添加为显式列。我们这样做 通过 cbind,否则 Metric 列将位于末尾。
然后,我们将其放入 renderTable 中并传回。
- 请注意,由于现在只有一个 table,您可以使用 renderTable 并且table直接输出而不用担心renderUI和 uiOutput.