R 筛选数据在错误中使用textinput:参数不是字符向量
enc2utf8中出现错误:参数不是字符向量。 我使用selectInput、checkboxGroupInput、textInput来过滤服务器中的数据,并得到上述错误;我已经尝试过filter()、subset(),但当按四列以上的列过滤数据并且参数是字符向量时(例如,corp%在%c('Honda','Nissan')中),它们会出现相同的问题 数据集中有市场,公司,中型企业类型,中型企业id,度量,日期,价值列 在代码中,品牌,名称(tmp,年份是用于过滤数据的字符向量R 筛选数据在错误中使用textinput:参数不是字符向量,r,filter,shiny,R,Filter,Shiny,enc2utf8中出现错误:参数不是字符向量。 我使用selectInput、checkboxGroupInput、textInput来过滤服务器中的数据,并得到上述错误;我已经尝试过filter()、subset(),但当按四列以上的列过滤数据并且参数是字符向量时(例如,corp%在%c('Honda','Nissan')中),它们会出现相同的问题 数据集中有市场,公司,中型企业类型,中型企业id,度量,日期,价值列 在代码中,品牌,名称(tmp,年份是用于过滤数据的字符向量 库(闪亮) 图
库(闪亮)
图书馆(dplyr)
图书馆(DT)
ui尝试打印(输入$measure)
在对所有数据进行子集之前,将其初始化为NULL
。您应该添加:
if(is.null(input$measure))
measure = unique(data_df$measure)
else
measure = input$Measure
修改
measure==input$Measure,
到
因此,当用户未进行选择时,该列上实际上将没有过滤器
工作示例
以下内容对我来说很好。注意,我已经创建了自己的数据集“df”,并修改了您的tmp()reactive,因此在本例中它使用我的df作为输入数据集
df = data.frame(Market=c("Asia","Asia","Europe","Europe"),
Corp=c("a","b","c","d"),
Med_type = c('Imported','Joint Venture','Local','Local'),
Med_id = c("Honda","Honda","Nissan","Nissan"),
measure=c('Unit','RMB','Dollar','Dollar'),
date = c('2017','2016','2017','2016'),
value=c(1,2,3,4 ))
library(shiny)
library(dplyr)
library(DT)
ui<-fluidPage(pageWithSidebar(
headerPanel('Table'),
sidebarPanel(
fileInput('file1', 'Upload Data',
accept=c('text/csv', 'text/comma-separated-values,text/plain')),
selectInput('TA',"Market-type",c('Asia','Europe')),
selectInput('Length',"Length",c('1 year'='0','2 years'='1','3 years'='2','4 years'='3','5 years'='4')),
selectInput('NoBrand',"Top Brand/Cor",c('one'='1','two'='2','three'='3','four'='4','five'='5')),
selectInput('Period',"Period",c('Quarter'='Quarter','YR'='year')),
checkboxGroupInput('Measure','Measurement',c('Unit','RMB','Dollar')),
selectInput('Med_type','Med_type',c('Imported','Joint Venture','Local')),
textInput('Med_id','Med_id',value='Honda;Nissan')),
mainPanel(
dataTableOutput('table')
)))
server<-function(input,output){
options(shiny.maxRequestSize=100*1024^2)
## importing dataset
tmp <- reactive({
df
})
tmp2<-reactive({
## modify the inputs
data_df <- tbl_df(tmp())
year<-(2017-as.numeric(input$Length)):2017
name_tmp<-as.vector(unlist(strsplit(input$Med_id,';')))
temp_data<<-summarize(group_by(data_df,Corp),VValue=sum(value,na.rm = TRUE))
brands<-as.vector(arrange(temp_data,desc(VValue))$Corp[1:as.numeric(input$NoBrand)])
if(is.null(input$measure))
measure = unique(data_df$measure)
else
measure = input$Measure
## filtering by the input
mod_data<-data_df %>%
select(Market,Corp,Med_type,Med_id,measure,date,value) %>%
filter(Market==input$TA,
Corp%in%brands,
Med_id%in%name_tmp,
Med_type==input$Med_type,
measure==measure,
substr(date,1,4) %in% year
)
print(mod_data)
## Aggregation() & reformating
if(input$Period=="year"){
mod_data$date<-substr(mod_data$date,1,4)
mod_data<-group_by_if(mod_data,is.character)
mod_data<-summarise(mod_data,Value=sum(value,na.rm = TRUE))
} else {mod_data<-summarise(group_by_if(mod_data,is.character),Value=sum(value,na.rm=TRUE))}
})
## printing table
output$table<-DT::renderDataTable({tmp2()})
}
shinyApp(ui=ui,server = server)
df=data.frame(市场=c(“亚洲”、“亚洲”、“欧洲”、“欧洲”),
公司=c(“a”、“b”、“c”、“d”),
Med_type=c(“进口”、“合资”、“本地”、“本地”),
Med_id=c(“本田”、“本田”、“日产”、“日产”),
计量单位=c(‘单位’、‘人民币’、‘美元’、‘美元’),
日期=c('2017'、'2016'、'2017'、'2016'),
值=c(1,2,3,4))
图书馆(闪亮)
图书馆(dplyr)
图书馆(DT)
ui问题已经解决了。错误实际上来自spread()
函数。当存在空数据帧时,spread()
将调用enc2utf8中的错误:参数不是字符向量
。因此,我添加了一些条件参数,以防止运行shinyapp后数据帧为空。此外,isolate()
也是用户控制输入执行的有用函数 我尝试添加if,但仍然得到相同的错误;我认为,当我仅通过Market==input$TA,Med_type==input$Med_type,measure==input$measure,substr(date,1,4)%in%year
shinyApp进行筛选时,可能会限制筛选中使用的参数数量。你是否也修改了行measure==input$measure,
tomeasure==measure
与我的示例代码一样?这不是筛选器中的参数数。是的,是的。我将textInput
替换为selectizeInput
。现在,当我想按品牌过滤时会出现错误。当我重试时,当我想按品牌和Med_id过滤时,错误仍然会出现:(我使用选项(shinny.fullstacktrace=TRUE)
并找到引入此错误的函数:调用自:(函数(e){if(继承(e,“shinny.silent.error”))return()句柄警告:enc2utf8中的错误:参数不是字符向量
,但仍然不知道如何处理此错误
df = data.frame(Market=c("Asia","Asia","Europe","Europe"),
Corp=c("a","b","c","d"),
Med_type = c('Imported','Joint Venture','Local','Local'),
Med_id = c("Honda","Honda","Nissan","Nissan"),
measure=c('Unit','RMB','Dollar','Dollar'),
date = c('2017','2016','2017','2016'),
value=c(1,2,3,4 ))
library(shiny)
library(dplyr)
library(DT)
ui<-fluidPage(pageWithSidebar(
headerPanel('Table'),
sidebarPanel(
fileInput('file1', 'Upload Data',
accept=c('text/csv', 'text/comma-separated-values,text/plain')),
selectInput('TA',"Market-type",c('Asia','Europe')),
selectInput('Length',"Length",c('1 year'='0','2 years'='1','3 years'='2','4 years'='3','5 years'='4')),
selectInput('NoBrand',"Top Brand/Cor",c('one'='1','two'='2','three'='3','four'='4','five'='5')),
selectInput('Period',"Period",c('Quarter'='Quarter','YR'='year')),
checkboxGroupInput('Measure','Measurement',c('Unit','RMB','Dollar')),
selectInput('Med_type','Med_type',c('Imported','Joint Venture','Local')),
textInput('Med_id','Med_id',value='Honda;Nissan')),
mainPanel(
dataTableOutput('table')
)))
server<-function(input,output){
options(shiny.maxRequestSize=100*1024^2)
## importing dataset
tmp <- reactive({
df
})
tmp2<-reactive({
## modify the inputs
data_df <- tbl_df(tmp())
year<-(2017-as.numeric(input$Length)):2017
name_tmp<-as.vector(unlist(strsplit(input$Med_id,';')))
temp_data<<-summarize(group_by(data_df,Corp),VValue=sum(value,na.rm = TRUE))
brands<-as.vector(arrange(temp_data,desc(VValue))$Corp[1:as.numeric(input$NoBrand)])
if(is.null(input$measure))
measure = unique(data_df$measure)
else
measure = input$Measure
## filtering by the input
mod_data<-data_df %>%
select(Market,Corp,Med_type,Med_id,measure,date,value) %>%
filter(Market==input$TA,
Corp%in%brands,
Med_id%in%name_tmp,
Med_type==input$Med_type,
measure==measure,
substr(date,1,4) %in% year
)
print(mod_data)
## Aggregation() & reformating
if(input$Period=="year"){
mod_data$date<-substr(mod_data$date,1,4)
mod_data<-group_by_if(mod_data,is.character)
mod_data<-summarise(mod_data,Value=sum(value,na.rm = TRUE))
} else {mod_data<-summarise(group_by_if(mod_data,is.character),Value=sum(value,na.rm=TRUE))}
})
## printing table
output$table<-DT::renderDataTable({tmp2()})
}
shinyApp(ui=ui,server = server)