我正在尝试创建一个UI,该UI将允许用户更改非数字输入(它们都是诸如<3的限制),然后可以对新向量进行进一步的分析。 假设他们有一个向量X =(1、2、3,<1、5、3)。我希望有一个名为“ <3”的数字输入,无论输入什么值,它都将被替换。
我能够为每个非数字输入创建输入,但是它具有我想要的标题, 和 div表单组“ shiny-input-”容器。
当我添加该部分以覆盖原始数据的副本时,它不会编译,并且出现错误消息:
Warning: Error in subset.default: argument "subset" is missing, with no default
到目前为止,我能做的最好的事情是:
l <- c(1,2,3,4,5,7, '<1', 4,5, 7, '<3') # Example input
library(shiny)
ui <- fluidPage(
titlePanel("Plot non numeric Data"),
sidebarLayout(
sidebarPanel(
uiOutput("LowerLimits")
),
mainPanel(
plotOutput("distPlot")
)
)
)
server <- function(input, output) {
l2 = l
data <- reactiveValues(nonN = factor(l[which(is.na(suppressWarnings(as.numeric(l))))]) )
# Bad bit of code
output$LowerLimits <- renderUI({
LL <- list()
if(length(data$nonN) > 0){
for(i in 1:length(data$nonN)){
assign(paste("Test", levels(data$nonN)[i]),numericInput(levels(data$nonN)[i],paste("Test", levels(data$nonN)[i]), value = NULL) )
LL <- c(LL, get(paste("Test", levels(data$nonN)[i])))
}
}
LL
})
# Really bad bit of code that crashes the app
observe({
if(length(data$nonN) > 0){
for(i in 1:length(data$nonN)){
l2[which(is.na(suppressWarnings(as.numeric(l))))][i] = subset(x = input, select = levels(data$nonN)[i])
}
}
})
output$distPlot <- renderPlot({
plot(l2)
})
}
# Run the application
shinyApp(ui = ui, server = server)
有什么办法 1)输入中没有* div form-group ...`部分 2)能够更改我的数据
第一行的示例输入就是一个示例。它可以具有任何长度,可以是任意数量的数字或非数字值。
谢谢。
答案 0 :(得分:1)
因此,事实证明可以使用lapply
和reactiveValuesToList
完成此操作,如下所示。还需要使用unique
参数在多个空格中添加nonN
,因为也可以使用重复的非数字输入(我忘了提及,但是很容易解决)。最终的代码是:
l <- c(1,2,3,4,5,7, '<1', 4,5, 7, '<3', '<3')
library(shiny)
test = NULL
ui <- fluidPage(
titlePanel("Plot non numeric Data"),
sidebarLayout(
sidebarPanel(
uiOutput("LowerLimits")
),
mainPanel(
plotOutput("distPlot")
)
)
)
server <- function(input, output) {
l2 = l
data <- reactiveValues(nonN = factor(l[which(is.na(suppressWarnings(as.numeric(l))))]) )
# Bad bit of code
output$LowerLimits <- renderUI({
if(length(unique(data$nonN)) > 0){
lapply(1:length(unique(data$nonN)), function(i){
numericInput(levels(data$nonN)[i],paste("Test", levels(data$nonN)[i]), value = NULL)
})
}
})
# Really bad bit of code
output$distPlot <- renderPlot({
if(length(data$nonN) > 0){
for(i in 1:length(unique(data$nonN))){
l2[l2 == levels(unique(data$nonN))[i]] = subset(as.matrix(t(reactiveValuesToList(input))), select = levels(unique(data$nonN))[i])
}
}
plot(as.numeric(l2))
})
}
# Run the application
shinyApp(ui = ui, server = server)