餡子付゛録゛

ソフトウェア開発ツールの便利な使い方を紹介。

-1*f()より-f()

Rで「-1*f()が気持ち悪い」と言う指摘を受けて、-f()だとSyntax errorになりそうで逆に気持ち悪いんじゃないかと思っていたら、年寄りの戯言でした。
どういう事かと言うと、この二つがRではS式が異なるわけです。

f <- function(n){ n + 1 }
as.list(quote(-f(2)))
as.list(quote(-1*f(2)))

実行結果は以下のようになります。Rにはオペラント一つの演算子"-"があるのか!*1

1 2 3
-1*f() `-` f(2)  
-f() `*` -1 f(2)

速度的には大きく影響する部分にならないと思いますが、以下のような単純な100万回ループで2.42秒が2.05秒になったりするので、細かいチューニング・ポイントとして覚えておいても良いかも知れません。

gc(); gc()
n <- 0
system.time({
  for(i in 1:1000000){
    n <- n - f(7)
  }
})
print(n)

gc(); gc()
n <- 0
system.time({
  for(i in 1:1000000){
    n <- n - 1 * f(7)
  }
})
print(n)

*1:Lispでも(- 1)と書けばいいわけだし、驚く事は無いです