728x90
반응형
샤이니 서버 함수에서 사용되는 render*() 함수의 첫 번째 인자는 표현식(expression)이다. 하나 이상의 표현식이 필요한 경우에는 이것을 {}으로 감싸면 하나의 표현식으로 처리된다. 그리고 복수의 표현식을 사용할 때는 R 함수에서와 같이 마지막 표현식의 값이 전체 표현식의 값이 되도록 프로그래밍 해야 한다. R은 표현식을 대상으로 프로그래밍할 수 있는 언어이다.
이에 관해서는 R이 설치될 때 포함되어 있는 <The R Language Defintion>이라는 문서에 잘 나와있다.
샤이니 render*() 함수들과 반응성 표현식을 만드는 reactive() 함수 내부를 보면 installExprFunction()이라는 샤이니 내부 함수를 첫 부분에 사용한다.
> library(shiny)
> renderText
function (expr, env = parent.frame(), quoted = FALSE, outputArgs = list())
{
installExprFunction(expr, "func", env, quoted)
createRenderFunction(func, function(value, session, name,
...) {
paste(utils::capture.output(cat(value)), collapse = "\n")
}, textOutput, outputArgs)
}
<bytecode: 0x0000000015cbe1d8>
<environment: namespace:shiny>
이 함수는 다음과 같이 정의되어 있다.
> installExprFunction
function (expr, name, eval.env = parent.frame(2), quoted = FALSE,
assign.env = parent.frame(1), label = deparse(sys.call(-1)[[1]]),
wrappedWithLabel = TRUE, ..stacktraceon = FALSE)
{
if (!quoted) {
quoted <- TRUE
expr <- eval(substitute(substitute(expr)), parent.frame())
}
func <- exprToFunction(expr, eval.env, quoted)
if (length(label) > 1) {
label <- paste0(label, collapse = "\n")
}
if (wrappedWithLabel) {
func <- wrapFunctionLabel(func, label, ..stacktraceon = ..stacktraceon)
}
else {
registerDebugHook(name, assign.env, label)
}
assign(name, func, envir = assign.env)
}
<bytecode: 0x0000000015c935d0>
<environment: namespace:shiny>
이 함수의 행동을 들여다보면 render*() 함수의 역할을 추측해볼 수 있다. 이것을 R 콘솔에서 실행해본다.
> library(shiny)
> installExprFunction({x <-1;y<-x;x+3},name = "k")
> k
function (...)
{
if (..stacktraceon)
..stacktraceon..(`NULL`(...))
else `NULL`(...)
}
<environment: 0x0000000015d06528>
> k()
[1] 4
그 결과를 보면 {x <- 1; y<- x; x+3}이라는 표현식을 가지고 k라는 함수를 만들고 있으며, 이 함수는 마지막 표현식을 반환하는 R 함수의 형태를 지닌 것을 알 수 있다. 그리고 마지막 표현식의 값이 전체 표현식의 반환 값이 된다. 즉 이 코드들이 하나의 함수의 바디로 취급된다.
반응형
'전공 > R프로그래밍' 카테고리의 다른 글
R프로그래밍 20. R에서 파일 다루기 (0) | 2019.08.14 |
---|---|
R프로그래밍19. 비표준 평가(non-standard evaluation)와 탈출구(escape hatch) (0) | 2019.08.08 |
R프로그래밍 17. 느긋한 평가 조급한 평가 (0) | 2019.08.06 |
R프로그래밍 16.R 환경 (0) | 2019.08.01 |
R프로그래밍 15. R 함수 (0) | 2019.07.31 |