【问题标题】:Error: attempt to use zero-length variable name错误:尝试使用零长度变量名
【发布时间】:2015-07-13 14:23:35
【问题描述】:

没有打开任何文件,打开Rstudio时出现以下错误:

“错误:尝试使用零长度变量名”

我的所有命令都被忽略(即没有任何反应,没有警告,并且 R 对我所做的任何事情都没有响应)并且我尝试了 rm 和 gc 选项但没有可用,并且还更新到最新版本的 Rstudio 和 R 但我仍然得到这个错误。

我正在运行 Windows 7(64 位)。

【问题讨论】:

  • 什么操作系统?什么 R 和 RStudio 版本(明确)?您是否设置了.Rprofile 文件以在启动时自动运行代码?这些命令究竟是如何被忽略的?你在控制台看到提示了吗?

标签: r


【解决方案1】:

我在dplyr github page 上发布了一个问题。我可以使用下面的代码重现结果。它与 csv 是否包含一列没有标题的行名有关。 read_csvread.csv 以不同方式处理此问题,因此与 filter 产生不同的结果。

首当其冲的情况

write_csvread_csvread.csv;两者都适用于filter

library(readr)
library(dplyr)

mtcars %>% write_csv("~/Desktop/test.csv")
test_r <-  read_csv("~/Desktop/test.csv") %>% filter(hp>100)
test.r <-  read.csv("~/Desktop/test.csv") %>% filter(hp>100)

现在是失败的时候

当通过write.csv 之类的过程生成 csv 时,除非该人将默认的 row.names 更改为 FALSE,否则它会引入一列不带标题的行名。在读回数据时,read_csv 不会填充行名所在的标题,但read.csv 会计算一个 X。因此,当filter 处理read.csv 导入时,它的所有标题都带有填充单元格,但是filterread_csv 之后至少在行名所在的位置有一个空的标题单元格。

test1_r %&gt;% filter(hp&gt;100) 之后的以下代码应该会出错,并出现以下错误

Error in filter_impl(.data, dots) : 
  attempt to use zero-length variable name

同样,最大的区别在于 write.csv 如何生成 csv。

mtcars %>% write.csv("~/Desktop/test1.csv")


test1_r <- read_csv("~/Desktop/test1.csv")
test1_r %>% str() 
#should fail here
test1_r %>% filter(hp>100)


test1.r <- read.csv("~/Desktop/test1.csv")
test1.r %>% str() 
test1.r %>% filter(hp>100)

要解决这个问题,您可以使用@hackR 上面提到的read.csv。或者,当您知道 csv 的行为如下时,您可以对第一列进行子集化:

test1_r <- read_csv("~/Desktop/test1.csv")[-1]

或者,如果您可以控制 csv 创建步骤,则可以将选项 row.names=FALSE 添加到 write.csv

mtcars %>% write.csv("~/Desktop/test2.csv", row.names = FALSE)
test2.r <- read_csv("~/Desktop/test2.csv")
test2.r %>% str() 
test2.r%>% filter(hp>100)

或如上所示使用write_csv

【讨论】:

  • @skeletonnoire,这解决了你的问题吗?
  • 如果您的 .csv 有一个没有标题的列,也会发生这种情况。
  • @data_steve 谢谢,read_csv 对我有用,因为最初我使用 read.csv 来读取我的文件,这也会导致此错误。
【解决方案2】:

我收到了同样的错误消息,它与 Hadley 的 readr 包中的 read_csv() 有关。如果我这样做:

cyt <- read_csv(fil)
cyt2 <- cyt %>% filter(EPID == 10030001)

然后我收到错误消息“filter_impl(.data, dots) 中的错误:尝试使用零长度变量名”。但如果我使用类似的基本 read.csv() 函数,那么它工作正常。

cyt <- read.csv(fil, stringsAsFactors = FALSE)
cyt2 <- cyt %>% filter(EPID == 10030001)

我认为这可能是 read_csv() 中的一个错误,或者我误用了 read_csv()。


在您的特定情况下,当您加载 RStudio 时,可能会自动运行某些东西。

【讨论】:

  • 我有同样的问题,用 read.csv 替换就解决了。
  • 我有完全相同的问题
【解决方案3】:

将此作为可见性的答案:如果您尝试通过在 Rmd 中选择所有并按 Enter 键来运行,就像使用普通 R 脚本一样。 RStudio 尝试将这一切都作为 R 代码运行,包括降价部分,这会导致您看到的错误。

您可以通过单击绿色播放按钮或在 Rmd 编​​辑器顶部的下拉菜单中选择一个运行选项来运行单个块来避免这种情况。

Try run all from RUN dropdown

【讨论】:

  • 我可能应该把它变成一个自我回答的问题,但我最近确实发生了这种情况,但实际上并没有运行超过一个代码块。事实证明,RStudio 在宽 unicode 字符方面存在一些问题,这使得它认为代码块最后包含了 ```。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 2022-06-13
  • 2020-10-30
  • 2011-07-26
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多