关于错误“:=和`:=`(...)被定义为在j中使用,只有一次和特定的方式。见帮助(“:=”)“
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于错误“:=和`:=`(...)被定义为在j中使用,只有一次和特定的方式。见帮助(“:=”)“相关的知识,希望对你有一定的参考价值。
我在data.table中遇到了一个奇怪的错误消息
我使用:=
修改了一个data.table,没有任何错误就完全没问题了。当我尝试将代码放入函数时,会出现以下错误消息。
Error in `:=`(date, as.Date(as.character(date), "%Y%m%d") - 1) :
:= and `:=`(...) are defined for use in j, once only and in particular ways. See help(":="). Check is.data.table(DT) is TRUE.
这是可重复的例子
testdat <- data.table(ID = c(1:10), date = c(20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101), Number = rnorm(10))
# The single line command works fine.
testdat[, date := as.Date(as.character(date),"%Y%m%d") - 1][, Number:= NULL]
# But if I wrote them into a function, it failed.
# ( In this case, it worked as well.. So I got totally lost. )
test2 <- data.frame(ID = c(1:10), date = c(20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101), Number = rnorm(10))
readdata <- function(fn){
DT <- data.table(fn)
DT[, date:= as.Date(as.character(date),"%Y%m%d") - 1][, Number:= NULL]
return(DT)
}
为了更好地描述,我将部分原始代码放在这里。所以你可能会明白哪里出了问题。
readdata <- function(fn){
DT <- fread(fn, sep=",")
# DT <- fread("1202.txt")
setnames(DT, paste0("V",c(1:12)), column_names)
# Modification on date
setkey(DT,uid)
DT[,date := as.Date(as.character(date),"%Y%m%d") - 1][, ignore:= NULL] #ignore is the name of one column
...}
我有一个txt文件列表,我想对每个文件进行计算。第一步是使用fread,然后逐个进行。假设我现在要根据“1202.txt”文件进行计算。如果我从DT <- fread("1202.txt")
开始然后继续。它不会出现这个错误。
如果我想使用readdata("1202.txt")
,则会出现错误消息。最奇怪的是,我之前使用过readdata
没有任何错误。
那么这里发生了什么?有什么建议?谢谢。
> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=English_United States.1252
[2] LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.8.11
loaded via a namespace (and not attached):
[1] tools_3.0.2
编辑
经过一些试验,我发现如果我修改代码如下,它就可以了
readdata <- function(fn){
DT <- fread(fn, sep=",")
DT <- data.table(DT) ## Just add this line compared to the original one.
# DT <- fread("1202.txt")
setnames(DT, paste0("V",c(1:12)), column_names)
# Modification on date
setkey(DT,uid)
DT[,date := as.Date(as.character(date),"%Y%m%d") - 1][, ignore:= NULL] #ignore is the name of one column
...}
所以错误是由于恐惧?在fread之后,它应该是data.table。为什么我需要使用data.table(DT)来转换它?
编辑
谢谢你的关注。这是2014年2月4日的更新
我首先卸载了我的1.8.11,并按照Matt的说明进行操作。再次从CRAN安装1.8.10,然后一步一步地执行他的代码。事实证明没有任何错误。
然后我卸载了1.8.11,然后尝试使用预编译的zip文件再次安装1.8.11。
像往常一样,有一条警告信息:
> install.packages("~/Desktop/data.table_1.8.11.zip", repos = NULL)
Warning in install.packages :
package ~/Desktop/data.table_1.8.11.zip?is not available (for R version 3.0.2)
Installing package into C:/Users/James/R/win-library/3.0?(as lib?is unspecified)
package data.table?successfully unpacked and MD5 sums checked
> require(data.table)
Loading required package: data.table
data.table 1.8.11 For help type: help("data.table")
似乎警告消息是错误的,当我加载包时它完全没问题。而在这个时候,整个过程完全没问题。感谢Matt,Arun和所有其他热情的人的耐心。我是data.table的初学者。而你的善意真的很感激。
这是另外一件事,正如我已经在这个link报道的那样,仍然没有解决。
> ?melt.data.table
No documentation for 憁elt.data.table?in specified packages and libraries:
you could try ??melt.data.table?
真的很可惜。有任何想法吗?
我在该链接中报告了我的sessionInfo。我使用的是Win8.1 64位
(这对评论来说太长了,所以我把它作为答案)。我无法重现你的错误。 (也许一些data.table专家可以给你更好的解释)。这对我来说很好:
readdata <- function(fn){
DT <- fread(fn) ## no need to put a sep here, fread guess it
DT[, date:= as.Date(as.character(date),"%Y%m%d") - 1][, Number:= NULL]
return(DT)
}
write.csv(test2,'test2.csv',row.names=F) ## fread works better without rownames
readdata('test2.csv')
ID date
1: 1 2012-12-31
2: 2 2012-12-31
3: 3 2012-12-31
4: 4 2012-12-31
5: 5 2012-12-31
6: 6 2012-12-31
7: 7 2012-12-31
8: 8 2012-12-31
9: 9 2012-12-31
10: 10 2012-12-31
[编辑来自马特]我也无法重现。根据评论,这正是我所做的。你们有什么不同?
$ R
R version 3.0.2 (2013-09-25) -- "Frisbee Sailing"
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
> require(data.table)
Loading required package: data.table
data.table 1.8.10 For help type: help("data.table")
> test2 <- data.frame(ID = c(1:10), date = c(20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101, 20130101), Number = rnorm(10))
> test2
ID date Number
1 1 20130101 0.26937712
2 2 20130101 0.72113244
3 3 20130101 -0.66086356
4 4 20130101 0.47507096
5 5 20130101 0.69400777
6 6 20130101 -1.26948436
7 7 20130101 1.75919781
8 8 20130101 -0.05306206
9 9 20130101 1.59880358
10 10 20130101 0.69531516
> write.csv(test2,'test2.csv',row.names=FALSE)
> readdata <- function(fn){
+ DT <- fread(fn)
+ DT[, date:= as.Date(as.character(date),"%Y%m%d") - 1][, Number:= NULL]
+ return(DT)
+ }
> readdata("test2.csv")
ID date
1: 1 2012-12-31
2: 2 2012-12-31
3: 3 2012-12-31
4: 4 2012-12-31
5: 5 2012-12-31
6: 6 2012-12-31
7: 7 2012-12-31
8: 8 2012-12-31
9: 9 2012-12-31
10: 10 2012-12-31
>
重新安装data.table v1.8.10 / v1.8.11(我尝试了两个版本)后,重新启动了一个新的R会话。问题解决了。
事实证明我的问题是由安装了5个月的开发版本引起的。
data.table
主页略有误导:
上次为Windows预编译的推荐快照:v1.8.11 rev931 2013年9月4日
[主页] [1]已经改进,现在读取:
install.packages("data.table", repos="http://R-Forge.R-project.org")
或者,如果失败,复制到此主页的最后一个预编译.zip for Windows可能就足够了:v1.8.11 rev1110 2014年2月4日
感谢大家提供有价值的答案和评论。
以上是关于关于错误“:=和`:=`(...)被定义为在j中使用,只有一次和特定的方式。见帮助(“:=”)“的主要内容,如果未能解决你的问题,请参考以下文章
Java基础,关于流程控制的问题:输入错误,提示错误并且重新输入。 这个快把我整崩溃了,请大家帮帮我