我尝试编写一个新的运算符,双波形符~~
,表示要传递给另一个函数的不同类型的公式(例如,镜像~~
的功能lavaan
包lavaan syntax)。
问题是y ~~ x
返回y ~ ~x
,其中第二个~
与预测变量一起返回。
我在这里完全失败了。似乎~
是一个没有方法的原始函数.Primitive("~")
,与+
不同。所以S3方法的现有教程是无用的。
这是一个死路一条,我是否正在做一些真正反对编程语言的事情?或者我有一个简单的解决方案吗?
答案 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
在父框架中可见?