为波形符/公式定义新运算符

时间:2017-02-24 13:30:17

标签: r operators

我尝试编写一个新的运算符,双波形符~~,表示要传递给另一个函数的不同类型的公式(例如,镜像~~的功能lavaanlavaan syntax)。

问题是y ~~ x返回y ~ ~x,其中第二个~与预测变量一起返回。

我在这里完全失败了。似乎~是一个没有方法的原始函数.Primitive("~"),与+不同。所以S3方法的现有教程是无用的。

这是一个死路一条,我是否正在做一些真正反对编程语言的事情?或者我有一个简单的解决方案吗?

1 个答案:

答案 0 :(得分:1)

我想,如果您接受评论,我可以从中得出答案:

~ R 中的运算符,例如+-/*。虽然可以使用刻度线`xxx`和qoute" xxx"来为变量使用多种字符。您还需要使用刻度线访问它们(请参阅?Reserved)。 (我将在这里使用引号而不是刻度,但考虑使用刻度来获得更接受的样式指南。)

R是一种函数式编程语言,因此您可以将每个语言语句作为函数访问,例如a + b"+"(a, b)相同。当你写a + b时,它只是语法糖 - 语言方面它被翻译成带有两个参数的原始函数调用。

为了使事情复杂化,有一个评估顺序。因此,如果您撰写a~~b,则会将其翻译为"~"(a, ~b)。这是因为~是一个被称为单个字符的原始操作符。您仍然可以定义函数"~~" <- function(a,b) {a + b},但您只能通过"~~"(a,b)直接调用它才能使其正常工作。

另一方面,您需要能够指定二元运算符的外观。定义一个函数"asdf" <- function(a,b) {a + b}是不够的,这将工作:a asdf b

R有一些东西来定义二元运算符(R: What are operators like %in% called and how can I learn about them?),看看像magrittr的%>%或doParallel&#39; s %dopar%中使用的大部分二元运算符。因此,最好使用%,即<tick>%~~%<tick> <- function(a,b) {a+b}来坚持二元运算符语法。然后,您可以使用语法糖a %~~% b轻松访问它。

奇怪的是,我同意。至于魔术技巧:在家"for"(a, 1:10, {print(a)})试试。奖金问题:为什么a在父框架中可见?