【问题标题】:R - Error in `:=`(variable, as.character(variable))R - `:=`中的错误(变量,as.character(变量))
【发布时间】:2020-02-16 04:44:59
【问题描述】:

我正在尝试运行 R 脚本,可以使用以下命令找到 here plot_trace.R -m ./log.model.csv ./log.trace.csv.

这两个csv文件可以在here找到。

这会产生错误:

Error in `:=`(variable, as.character(variable)) : 
  Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are defined for use in j, once only and in particular ways. See help(":=").
Calls: [ -> [.tbl_df -> check_names_df -> :=

最后但并非最不重要的是我的 sessionInfo() 输出:

R version 3.4.4 (2018-03-15)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.3 LTS

Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] compiler_3.4.4

谢谢

【问题讨论】:

  • 您好,能否提供一个minimal reproducible example,以便我们更好地帮助您?另外,您是否尝试在导致错误的变量上运行is.data.table
  • is.data.table(trace.df) 评估为假。这是否意味着我读入的跟踪数据格式不正确?一个最小的可重现示例包括编译整个项目,然后仍然不能保证会重现错误,因为 repo 的维护者不会遇到与我相同的问题。
  • 一个最小的可重现示例将包括一个可以重新创建错误的数据样本,以及产生它的代码的确切部分(我想我们可能已经猜到导致错误的行)。查看我分享的链接。没有它,我们所能做的就是告诉您您正在尝试对不是data.table 的对象使用data.table 方法,因此会出现错误。
  • 我更新了我的帖子。如果您再看一看,我将不胜感激。
  • 谢谢,我能够使用您提供的数据运行此脚本。但是,我没有任何错误。这是我使用的命令:Rscript --vanilla plot_trace.R -m ./log.model.csv ./log.trace.csv。您可以尝试逐步运行脚本,例如从 RStudio 运行,以查看问题出在哪里并检查 trace.df 的类吗?

标签: r data.table colon-equals


【解决方案1】:

看起来unnest 调用创建的不是数据表。

在第 56 行尝试添加:

trace.df <- as.data.table(trace.df)

【讨论】:

  • data.table 上调用unnest 会返回data.table。尝试使用 data.table 而不是数据框运行 unnest 文档中的示例。
  • 经过检查,这只适用于R 3.6及更高版本,我的错!
【解决方案2】:

更新

我发现这个脚本有两个问题:

  • 作者混合了来自tidyr 的函数和data.table 类的变量。这些函数可能会返回数据帧,并且在这些函数上使用data.table 语法会导致错误。不幸的是,某些tidyr 函数在操作某个函数时可能会返回data.table,但这似乎因tidyr 包的版本而有很大差异。

  • 来自tidyrunnest 函数有一个新接口。该脚本无法与 tidyr 1.0.0 或更高版本一起使用。

以下是我为修复脚本而更改的行,使用 R 版本 3.6.1 和 tidyr 版本 1.0.0:

  • 第 56 行: 添加了trace.df &lt;- as.data.table(trace.df)
  • 第 64 行: 更改为 trace.df &lt;- unnest(trace.df, cols)
  • 第 65 行: 添加了trace.df &lt;- as.data.table(trace.df)

原答案

我能够在您提供的数据上运行脚本而没有错误。两者都有

Rscript --vanilla plot_trace.R -m ./log.model.csv ./log.trace.csv

chmod +x plot_trace.R
./plot_trace.R -m ./log.model.csv ./log.trace.csv

产生了以下情节:

你可以在RStudio中一步一步运行脚本来检查每一步之后trace.df的类吗?

【讨论】:

  • 感谢您的详细回答。不幸的是,升级到 3.6.1 后,错误仍然存​​在。运行Rscript --vanilla plot_trace.R -m ./log.model.csv ./log.trace.csv 给我:Error in strsplit(x, "\\|") : non-character argument Calls: [ ... [.data.table -&gt; eval -&gt; eval -&gt; lapply -&gt; FUN -&gt; strsplit Execution halted
  • @Moostropfen:错误不会持续存在,它是一个新错误,由第 62 行上对 strsplit 的调用引起。看来data.table 的问题确实通过升级到解决了3.6.1。检查trace.dfvaluefield 中的非字符值,尤其是缺失值。
  • 忘记我写的。我搞砸了一些事情......我按照推荐添加了trace.df &lt;- as.data.table(trace.df)。这给了我unnest() has a new interface. See ?unnest for details. Try df %&gt;% unnest(c(value, field)), with mutate() if needed Error in :=(CPU, as.integer(CPU)) : Check that is.data.table(DT) == TRUE. Otherwise, := and :=(...) are defined for use in j, once only and in particular ways. See help(":="). Calls: [ -&gt; [.tbl_df -&gt; check_names_df -&gt; := Execution halted。当我删除它时,我从一开始就收到相同的错误消息。
  • 我用新的解决方案更新了我的答案。我没有使用tidyr 1.0.0 版,所以我没有从unnest 的新界面中得到错误。这个新的解决方案应该可以解决您的问题!
猜你喜欢
  • 2015-10-29
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 2015-09-20
相关资源
最近更新 更多