0

私は次の機能を持っています:

calculateAngle <- function(x, y)
{
    v <- c(x, y)
    a <- c(1, 0)

    theta <- acos( sum(a*v) / ( sqrt(sum(a * a)) * sqrt(sum(v * v)) ) )

    if(v[[2]] < 0)
    {
        return(-1 * theta)
    }
    else
    {
        return(theta)
    }
}

これは、x と y の値を取り、そのベクトルと 1、0 のベクトルの間の角度を計算します。この関数は、これらの例でうまく機能します。

> calculateAngle(0, 1)
[1] 1.570796
> calculateAngle(0, -1)
[1] -1.570796
> calculateAngle(0, -10)
[1] -1.570796
> calculateAngle(rnorm(1), rnorm(1))
[1] -0.2600444

しかし、データフレームの列を渡そうとすると、各行の角度が必要な場合に単一の値が返されます。

df <- data.frame(x=rnorm(10), y=rnorm(10))

df$angle <- calculateAngle(df$x, df$y)

助けていただければ幸いです。

4

2 に答える 2

4

(警告: 私はこれに 5 秒以上費やす気がしないので、これは怠惰な答えです!)

calculateAnglev <- Vectorize(calculateAngle,c('x','y'))
> calculateAnglev(runif(2),runif(2))
[1] 0.2738694 0.8039875

つまり、パフォーマンスの観点から、これを真のベクトル化の代替と間違えてはいけません。

于 2013-03-08T20:02:21.203 に答える
2

のコードthetaは非常に複雑です。たとえば、sum(sqrt(a*a))常に 1 で常に であるsum(a*v)用語がありますx。またsum(v*v) = x^2+y^2、その形式を使用して、ベクトル引数にも機能するバージョンを取得します。

calculateAngle <- function(x, y)
{
   a <- c(1, 0)
   theta <- acos( x / sqrt(x^2+y^2))
   sign(y)*theta
}
于 2013-03-08T20:06:22.603 に答える