在包中创建函数正在将数据表语法从 := 更改为 `:=`

问题描述 投票:0回答:1

我编写了一个函数 - 只需运行它的文本就可以正常工作,将其设置为函数也可以正常工作,但是当我创建一个包来加载该函数时,它会更改一些语法,然后崩溃。

由于问题的复杂性,我不确定是否可以提供可重现的示例......

代码的一个示例是它改变了这一点:

y1[fueltype=="Petrol",fueltype:="PETROL"]

对此:

y1[fueltype == "Petrol", `:=`(fueltype, "PETROL")]

尽管据我所知这应该没问题(事实上,如果我只是从已更改的函数运行代码,它就可以运行),但当我运行该函数时,它会返回错误:

“错误:检查 is.data.table(DT) == TRUE。否则,:=、

:=
(...) 和 let(...) 被定义在 j 中使用,仅一次且特别方法请参阅帮助(“:=”)。:

有什么原因吗: a)当我通过包创建函数时,它坚持要更改代码 b) 它拒绝运行编辑后的代码,即使它看起来已将其更改为应该可以接受的内容。

再次 - 对于缺乏可重现的代码表示歉意,但由于该过程涉及设置新包,这似乎并不可行。

r function package data.table
1个回答
0
投票

这是对你的问题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(":=").
© www.soinside.com 2019 - 2024. All rights reserved.