2016년 7월 18일 월요일

ternary operator in R

ternary operator를 정의해버리는데 코드를 봐도 모르겠다. 세상엔 참 대단한 사람들이 많은듯.
http://stackoverflow.com/a/8790269/766330
(결론적으로 나는 그냥 ifelse()쓰기로 했음 ㅋㅋㅋ)

`?` <- function(x, y) {
  xs <- as.list(substitute(x))
  if (xs[[1]] == as.name("<-")) x <- eval(xs[[3]])
  r <- eval(sapply(strsplit(deparse(substitute(y)), ":"), function(e) parse(text = e))[[2 - as.logical(x)]])
  if (xs[[1]] == as.name("<-")) {
    xs[[3]] <- r
        eval.parent(as.call(xs))
  } else {
    r
  }
}    

assign(eg. )하는 데 bracket을 치는 수고를 감내할 수 있다면,
그러니까 아래와 같은 동작을 감내할 수 있다면
> y <- 1 ? 2*3 : 4
[1] 6
> y
[1] 1
> y <- (1 ? 2*3 : 4)
> y
[1] 6

더 간단하게,

`?` <- function(x, y)
    eval(
      sapply(
        strsplit(
          deparse(substitute(y)), 
          ":"
      ), 
      function(e) parse(text = e)
    )[[2 - as.logical(x)]])

댓글 없음:

댓글 쓰기