如何在 Shiny 中使用 textInput 来命名上传数据框的列
Posted
技术标签:
【中文标题】如何在 Shiny 中使用 textInput 来命名上传数据框的列【英文标题】:How to use textInput in Shiny to name columns of an uploaded data frame 【发布时间】:2018-09-18 07:05:04 【问题描述】:我正在尝试找到一种方法来使用 textInput 字段来允许用户在 Shiny 中指示数据框的列名。仪表板上的小背景:
Dashboard 允许用户上传 csv 文件并在数据框中指明他们想要使用的列。然后,他们选择列名和行名。然后他们上传的数据将被转换成一个较小的数据框,用于对应分析。
除了列/行命名方面,一切都很好。出于某种原因,当程序运行时,它会将文本输入指定为第一行/列的名称,然后将其他名称命名为“NA”。我尝试使用 strsplit() 来分解文本输入,但这不起作用。
谁能告诉我我做错了什么?这是我的代码和问题的样子:
ui <- fluidPage(
# Application title
titlePanel("Perceptual Map Dashboard"),
sidebarLayout(
# Sidebar with a slider and selection inputs
sidebarPanel(
#Excel doc row and column names
numericInput(inputId="startcol",label="Input start column:",value="", min=1,max=10000),
numericInput(inputId="endcol",label="Input end column:",value="", min=1,max=10000),
#Inputing brands and emotions
br(),
numericInput(inputId = "rownums",label = "How many emotions are you evaluating?",value = "", min = 1,max = 10000),
br(),
textInput ( 'brands', 'List the brands included in your perceptual map (separated by commas):', value=""),
textInput ( 'emotions', 'List the emotions included in your perceptual map (separated by commas):', value=""),
#Removing brands and emotions
#Select graph type
textInput(inputId="plottitle",label="Title your graph:"),
#Upload Excel Grid
fileInput(inputId = 'data', 'Upload CSV File',
accept=c('.csv')),
actionButton("go","Create Map")
),
# Visual Output
mainPanel(
wellPanel(h4('Visual')),
plotOutput(outputId = "plot", width = "100%", height=500),
downloadButton("downloadPlot", "Download Visual")
)
)
)
server <- function(input,output)
observeEvent(input$go,
x <- read.csv(input$data$datapath, header = F)
print(x)
str(x)
plot1 <- reactive(
x<-x[,as.numeric(input$startcol):as.numeric(input$endcol)]
column.sums<-colSums(x)
print(column.sums)
pmd.matrix<-matrix(column.sums, byrow = T, nrow=as.numeric(input$rownums))
pmd.df2<-as.data.frame(pmd.matrix)
# colnames(pmd.df2) = names
# print(pmd.df2)
# # row.names(pmd.df2)= c(as.character(input$emotions))
print(pmd.df2)
fit <- CA(pmd.df2, graph=F)
K <- plot.CA(fit, col.row = "blue", col.col="black", cex=.6,new.plot=T,
title=input$plottitle)
return(K)
)
output$plot<- renderPlot(
print(plot1())
)
output$downloadPlot2 <- downloadHandler(
filename = "Shinyplot.png",
content = function(file)
png(file)
print(plot1)
dev.off()
)
)
shinyApp(ui = ui, server = server)
ISSUE I AM SEEING:
c("“Burlington”", "”JC Penny”", "”Kohls”", "”TJ Maxx”", "”Marshalls”", "”Nordstrom Rack”", "”Old Navy”", "”Target”", "”Walmart”", "”Macys”", "”Amazon”", "”Nordstrom”", "”Ross”")
1 113
2 113
3 69
4 55
5 91
6 73
7 106
8 77
9 76
10 80
11 58
12 86
NA NA NA NA NA NA NA NA NA NA NA NA
1 63 78 87 68 67 33 57 67 87 96 77 41
2 123 100 71 70 50 77 67 93 33 44 35 36
3 93 84 68 56 79 44 41 41 129 40 132 38
4 43 51 62 63 59 50 58 109 70 82 66 27
5 105 91 65 79 51 70 49 67 40 56 34 36
6 69 71 89 66 55 68 83 51 39 67 34 44
7 53 61 46 59 53 76 53 80 39 65 32 30
8 55 55 52 61 63 48 85 70 57 97 60 32
9 66 68 71 72 71 47 52 57 89 61 94 48
10 61 55 60 56 52 56 39 60 37 39 33 65
11 69 66 56 56 40 63 69 68 27 65 27 69
12 70 66 59 61 46 73 62 72 47 86 113 63
【问题讨论】:
【参考方案1】:看起来可能有两个问题。首先,我假设列名是在 UI 的“品牌”中定义的。在示例中,命名被注释掉了,但是我创建了一个最小的示例,我认为它可以重新创建您所看到的内容。
1) 将“brands”定义为以逗号分隔的字符串作为您的 textInput 请求
brands<- "b1,b2,b3"
2) 另一个看起来像“名称”变量的问题没有被定义?也许这是由于注释掉了。我假设它需要是“名称
names <- brands
3) 用最小的 data.frame 'x' 重新创建流程
x<-data.frame(a=c(1,2,3),b=c(1,2,3),c=c(4,3,2))
pmd.matrix <- matrix(colSums(x),byrow=T,nrow=1)
pmd.df2 <- as.data.frame(pmd.matrix)
colnames(pmd.df2) <- names
pmd.df2
pmd.df2 的输出显示第一列已命名,其他列为 NA,如您的示例所示
> pmd.df2
b1,b2,b3 NA NA
1 6 6 9
原因是 input$names 是一个字符串变量,所以只有一个值。它需要拆分。下面使用 strsplit() 将返回一个 list() 对象,该对象可以是 unlist() 以返回要命名的对象向量,修复如下:
names <- unlist(strsplit(brands,","))
colnames(pmd.df2) <- names
pmd.df2
并返回命名列的结果:
> pmd.df2
b1 b2 b3
1 6 6 9
【讨论】:
这太棒了,非常感谢,Soren!这行得通。顺便说一句,我很抱歉,我在调试阶段就这样做了,看看其他一切是否正常。这现在完美无缺。看起来我最大的问题是“未列出”部分。我真的很感激! 另一个问题,如果您知道答案。该应用程序现在在本地运行时运行良好,但由于某种原因,当启动到 shinyapps.io 时,该图没有呈现。你知道为什么它在启动时不会出现,而是在本地出现吗? 安德鲁,该应用程序正在进步真好!本地与远程问题的原因有很多。 RStudio 有几篇文章,例如这篇文章:support.rstudio.com/hc/en-us/articles/… 这里重点介绍了有关文件名的问题,这可能是您的情况。看起来您正在从此处的输入中获取文件名:x 嗯...我在闪亮上检查了我的日志,看起来 CSV 加载正常,因为我可以看到它正在创建用于绘图的数据框,没有问题。然而,剧情似乎要停止了。我已经上传了所有的包,所以我猜可能是因为我在一个我知道不是最佳实践的 observeEvent 中绘图。我将对此进行更多调查并发布更新! 这很可能是因为它不是来自 renderPlot() 将包含各种 html 功能来支持它。总体而言,您应该考虑将数据框移动到 reactiveVal 或 reactiveValues。或者,您可能会考虑 'K以上是关于如何在 Shiny 中使用 textInput 来命名上传数据框的列的主要内容,如果未能解决你的问题,请参考以下文章
在 Shiny 中使用部分 textInput 作为 R 中的变量
如何使用 insertUI 在 Shiny 应用程序中将 textInput 转换为输出
如何在 ui.R 中读取 TextInput,在 global.R 中使用此值处理查询并使用 Shiny 在 server.R 中显示