【问题标题】:Quotations marks and expression引号和表达式
【发布时间】:2018-07-25 18:48:52
【问题描述】:

我今天开始学习 R 语言。

在定义了两个向量 x,y 之后,我在它们之间应用了外积,应用了文档中所说的内容。

f= outer (x, y, FUN = "*")

一切顺利。 然后我决定尝试一个匿名函数,所以我写了

f= outer (x, y, FUN = "function(x,y) cos(y) / (1+x^2)")

但我遇到了一个错误。但是,如果我写:

`f= outer (x, y, FUN = function(x,y) cos(y) / (1+x^2))`

有效。

为什么引号可以与 * 一起使用,但不能与此匿名函数一起使用? 感谢您的宝贵时间

【问题讨论】:

  • 因为你使用了变量,所以将它们放在引号中并不能告诉 R 它是一个变量
  • 尝试a = 1; b =2,然后执行"a + b"a + b。也是一样的原因。
  • 但是为什么使用 * 有效?
  • 阅读?outer?match.fun的文档
  • 现在很清楚了,谢谢:)

标签: r


【解决方案1】:

我不确定您所说的“工作”代码是什么意思:

`f= outer (x, y, FUN = function(x,y) cos(y) / (1+x^2))`

这将尝试访问一个名为f= outer (x, y, FUN = function(x,y) cos(y) / (1+x^2))变量,例如我可以写:

`f= outer (x, y, FUN = function(x,y) cos(y) / (1+x^2))` = 3
`f= outer (x, y, FUN = function(x,y) cos(y) / (1+x^2))`
# [1] 3

这是一件非常令人困惑的事情,但是用反引号 (`) 包围对象允许您声明任意命名的对象。

再一次,除非您完全知道自己在做什么(即,在您开始 R 编程的第一天之后),否则不要这样做。

无论如何,关于*为什么需要引号,那是因为*是一个运算符Everything in R is a function (almost),但运算符是特殊函数,因为它们允许您从左到右编写它们,例如:

variable1 operator variable2

不是正常的

function(variable1, variable2)

也就是说,所有的运算符都有一个函数形式;但是,为了区分函数形式和运算符形式,R 解析器需要用引号(或反引号)将它们分开;以下相同:

3 * 4
'*'(3, 4)
"*"(3, 4) #single and double quotes in R are basically the same
`*`(3, 4)

outerFUN 参数需要函数,而不是运算符,因此我们必须在其函数中提供*形式,例如"*".

更多细节——您可以观察到 R 在内部将运算符形式更改为函数形式作为代码解析过程的一部分(即,在评估之前,R 已经将运算符形式转换为函数形式):

as.character(substitute(3 * 4))
# [1] "*" "3" "4"

# alternatively
pryr::ast(3 * 4)
# \- ()
#   \- `*
#   \-  3
#   \-  4 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多