为什么函数中的数学顺序 [PEMDAS] 在 R 中不起作用?
这些工作正常:
-27^(1/3) == -3 # TRUE
-27^0.3333333333333333 == -3 # TRUE
Run Code Online (Sandbox Code Playgroud)
但是这些会导致错误吗?
foo <- function(x, y){return(x^(1/y))}
foo(x = -27, y = 3) # NaN
bar <- function(x, y){
a = 1 / y
b = x^a
return(b)
}
bar(x = -27, y = 3) # NaN
Run Code Online (Sandbox Code Playgroud)
预先感谢您的解释。
由于“一元减号” ( -) 运算符的优先级低得惊人,再加上 R 将负数提高到分数幂的惯例。-27^(1/3)读作“计算 27^(1/3) (==3),然后反转符号”。如果我们改为计算(-27)^(1/3),我们会得到NaN,因为负数不能可靠地提高到分数幂。评估是在函数内部还是外部是一个红鲱鱼;问题是 (-27) 是否首先被评估为表达式(如果您将其分配给函数参数或变量,或将其放在括号中)。
一元减号的优先级在2009 年的邮件列表线程和R FAQ 7.33 中进行了讨论,更一般地在math.stackexchange 问题中进行了讨论。还有就是为什么负值的部分功率是(相当技术)的说明NaN中?"^":
用户有时会对返回的值感到惊讶,例如为什么 '(-8)^(1/3)' 是 'NaN'。对于双输入,R 在所有平台上使用 IEC 60559 算法,以及用于“^”运算符的 C 系统函数“pow”。相关标准定义了许多极端情况下的结果。特别是,上例中的结果是 C99 标准规定的。在许多类似 Unix 的系统上,命令 'man pow' 提供了大量极端情况下的值的详细信息。