首页 > 解决方案 > R/R Shiny:$ 运算符对原子向量无效

问题描述

每次我使用 read_excel 加载 .xlsx 文件并将其传递到数据框(比如说命名数据)时,列标题都会得到“。” 插入其中。例如,对于具有三列“fruit 1”、“fruit 2”、“fruit 3”的 .xlsx 文件,将变为“fruit.1.”、“fruit.2.”、“fruit.3.”。为了删除它,我将使用以下代码 -

colnames(data) <- trimws(gsub("."," ",colnames(data), fixed = TRUE))

但是在我使用 fileInput 按钮上传 .xlsx 文件的 Shiny 应用程序中使用相同的方法,我无法使用这些列。例子 -

fruits <- reactive({
  req(input$file)
  inFile <- input$file
  if(is.null(inFile))
    return(NULL)

  fruits<-read_excel(paste(inFile$datapath, ".xlsx", sep=""), sheet = 1)
  
})

data <- reactive({
  req(fruits())
  data<-data.frame(fruits())
  data<- data[2:nrow(data),]
  colnames(data) <- trimws(gsub("."," ",colnames(data), fixed = TRUE))
})

if(any(is.na(data()[data()$"fruit 1" ==unique(data()$"fruit 1")[1],c("fruit 2","fruit 3")]))){
  print("There are blank fruit 2/fruit 3 names")
}else{
  print("There are no blank fruit 2/fruit 3 for the first batch")

}

我得到的错误是警告:$: $ 运算符中的错误对于if 行的原子向量无效。有人可以告诉我哪里出错了。

标签: rshiny

解决方案


这个问题似乎与returnfromreactive块有关,因为我们没有返回原始数据。最后一个表达式是对列名的赋值。

data <- reactive({
  req(fruits())
  data<-data.frame(fruits())
  data<- data[2:nrow(data),]
  colnames(data) <- trimws(gsub("."," ",colnames(data), fixed = TRUE))
  data
})

关于其他情况,最好使用[[子集而不是$因为$不通用,即我们不能将对象传递给子集

tmp <- data()[["fruit 1"]]
if(any(is.na(data()[ tmp==unique(tmp)[1],c("fruit 2","fruit 3")])))

推荐阅读