我编写了一个函数 - 只需运行它的文本就可以正常工作,将其设置为函数也可以正常工作,但是当我创建一个包来加载该函数时,它会更改一些语法,然后崩溃。
由于问题的复杂性,我不确定是否可以提供可重现的示例......
代码的一个示例是它改变了这一点:
y1[fueltype=="Petrol",fueltype:="PETROL"]
对此:
y1[fueltype == "Petrol", `:=`(fueltype, "PETROL")]
尽管据我所知这应该没问题(事实上,如果我只是从已更改的函数运行代码,它就可以运行),但当我运行该函数时,它会返回错误:
“错误:检查 is.data.table(DT) == TRUE。否则,:=、
:=
(...) 和 let(...) 被定义在 j 中使用,仅一次且特别方法请参阅帮助(“:=”)。:
有什么原因吗: a)当我通过包创建函数时,它坚持要更改代码 b) 它拒绝运行编辑后的代码,即使它看起来已将其更改为应该可以接受的内容。
再次 - 对于缺乏可重现的代码表示歉意,但由于该过程涉及设置新包,这似乎并不可行。
这是对你的问题a)部分的答案,以及对b)部分的猜测。
如果您解析表达式
fueltype:="PETROL"
,您将看到更改后的代码:
> deparse(quote(fueltype:="PETROL"))
[1] "`:=`(fueltype, \"PETROL\")"
这不是一个改变,这只是解析器的工作方式。 解析器将
:=
识别为中缀运算符,但 R 本身从不使用它,因此解析器不会将其解析为一个。
为什么在包中会发生这种情况,而在函数中却不会? 我们看到
> function() { fueltype:="PETROL" }
function() { fueltype:="PETROL" }
因为默认情况下,R 将源代码保留为在控制台或通过脚本输入的函数的一部分。 但是,包的默认设置是不保留源代码。
如果从命令行安装软件包,您可以使用选项
--with-keep.source
覆盖软件包的默认设置。 然后,当您从包中打印函数时,您将看到注释和原始格式,并且不会看到重新排列的 :=
表达式。
关于 b) 部分:你确定
y1
真的是一个 data.table
对象吗? 如果您尝试使用数据框或矩阵来执行此操作,您将收到您所看到的错误。 例如,
> library(data.table)
> mtcars[, disp := 4]
Error: Check that is.data.table(DT) == TRUE. Otherwise, :=, `:=`(...) and let(...) are defined for use in j, once only and in particular ways. See help(":=").