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

时间:2015-07-13 14:23:36

标签: r

在不打开任何文件的情况下,打开Rstudio时出现以下错误:

  

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

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

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

3 个答案:

答案 0 :(得分:8)

我在dplyr github page上发布了一个问题。我可以使用下面的代码重现结果。它与csv是否包含一列没有标题的rownames有关。 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,否则会引入一列没有标题的rownames。重新读取数据时,read_csv不会填写rownames所在的标题,但是read.csv会归结为X.因此,当filter处理read.csv次导入时,它包含所有已填充单元格的标题,但filter之后read_csv的标题单元格至少为rownames。

以下代码应在test1_r %>% filter(hp>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,如上所示。

答案 1 :(得分:3)

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

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

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

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

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

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

答案 2 :(得分:0)

将此作为获得可见性的答案:如果您尝试通过选择Rmd中的全部并像使用普通R脚本一样按Enter来运行,则会发生这种情况。 RStudio试图将所有这些作为R代码(包括降价部分)运行,从而导致您看到的错误。

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

Try run all from RUN dropdown