【问题标题】:R/ R Shiny: $ operator is invalid for atomic vectorsR/R Shiny:$ 运算符对原子向量无效
【发布时间】:2021-08-20 23:46:25
【问题描述】:

每次我使用 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")

}

我得到的错误是 Warning: E​​rror in $: $ operator is invalid for atomic vectors 对于 if 行。谁能告诉我哪里出错了。

【问题讨论】:

  • 您可以使用data()[["fruit 1"]]。此外,您应该在reactive 中使用return(data),即colnames(data) &lt;- trimws(gsub("."," ",colnames(data), fixed = TRUE)); data})
  • 这解决了我的问题!你能说出 [[]] 是做什么的吗?我仍在使用 $ 但返回的数据解决了它。
  • 你能帮我解决这个question吗?
  • 好像已经回答了。谢谢你的链接
  • 您能否让回答者知道这些细节。我知道他擅长回答闪亮的问题

标签: r shiny


【解决方案1】:

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

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")])))

【讨论】:

  • 感谢您的澄清!发现它真的很有帮助
猜你喜欢
  • 2014-05-15
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多