19

我正在尝试查看是否有一个函数可以直接获取负数的真实立方根。例如,在Java中,有Math.cbrt()函数。我正在寻找 R 中的等价物。

否则,我目前的黑客是:

x <- -8
sign(x) * abs(x)^(1/3)

每次打字都非常不优雅和麻烦。谢谢!

4

3 回答 3

24

听起来您只需要定义自己的Math.cbrt()功能。

这将使执行操作从不优雅和繁琐的操作转变为干净、富有表现力且易于应用的操作:

Math.cbrt <- function(x) {
    sign(x) * abs(x)^(1/3)
}

x <- c(-1, -8, -27, -64)

Math.cbrt(x)
# [1] -1 -2 -3 -4
于 2012-11-05T17:29:53.227 回答
3

在 R 中,您可能需要定义一个将结果限制为您的目标的新函数:

> realpow <- function(x,rad) if(x < 0){ - (-x)^(rad)}else{x^rad}
> realpow(-8, 1/3)
[1] -2
> realpow(8, 1/3)
[1] 2

如果您引用运算符并在其名称中使用环绕的“%”符号,则可以进行中缀操作。因为它的优先级很低,所以您需要使用括号,但您似乎已经知道这一点。

> `%r^%` <- function(x, rad) realpow(x,rad)
>  -8 %r^% 1/3
[1] -2.666667    # Wrong
> -8 %r^% (1/3)
[1] -2   #Correct

同意将提问者的版本纳入其矢量化容量:

`%r^%` <- function(x, rad) sign(x)*abs(x)^(rad)
于 2012-11-05T16:40:18.987 回答
-1

在 Java 中是这样的:

There are 3 cube-roots. Assuming you want the root that is real, you should do this:

x = 8;  //  Your value

if (x > 0)
    System.out.println(Math.pow(x, 1.0 / 3.0));
else
    System.out.println(-Math.pow(-x, 1.0 / 3.0));
于 2012-11-05T16:30:59.583 回答