2017-11-02 8 views
0

빛나는 모듈과 data.table을 사용하여 앱을 개발하려고하지만 작동 방법을 파악할 수 없습니다. 작은 예제는 모듈의 인수로 data.table, 변수 및 잘라 내기 값을 받고 다음 인수를 사용하여 data.table을 필터링하여 모든 결과를 인쇄해야하는 다음 응용 프로그램입니다.반짝이 모듈 및 data.table 필터 : 예상대로 작동하지 않습니다.

library(shiny) 
library(data.table) 

name <-c('a','b','c','d','e') 
value <- c(2,4,6,8,10) 
data <- data.table(name,value) 

# MODULE UI 
test_UI <- function(id) { 
    ns <- NS(id) 
    textOutput(ns("test")) 
} 

# MODULE Server 
test_OUT <- function(input, output, session, df, var, x) { 
    output$test <- renderText({  
    d <- df[var > x, ] 
    print(unique(d$name)) 
    }) 
} 

# App ui 
ui <- fluidPage(
    test_UI("test") 
) 

# App server 
server <- function(input, output,session){ 
    callModule(test_OUT, "test", data, 'value', 6) 
} 

# App 
shinyApp(ui, server) 

결과는 다음과 같습니다

> a b c d e 

있어야하는 경우 :

내가 dplyr 또는 필터링의 다른 방법을 사용하는 경우 내가 아는
> d e 

는,이 작업을해야하지만 필자는 매우 큰 데이터 세트를 다루고 있기 때문에 성능에 대한 data.table이 필요합니다. 미리 감사드립니다.

답변

0

"get"을 사용하여 작동하게 만듭니다.

d <- df[get(var) > x, ] 

d <- df[var > x, ] 

그것은 일 :

나는 라인을 교체!

0

이유가 작동하지 않는 이유는 data.table이 자신을 환경으로 사용하기 때문입니다. 다음 부모 환경합니다 (test_OUT 기능)에 보이는 지금 그것을 발견하지, 표시되지 않습니다 그래서

df[var > x, ] 

var을 (안 var의 가치,하지만 df[["var"]]주의)라는 이름의 열을 찾습니다. 캐릭터 벡터 "value"입니다.

따라서 x == 6부터 "value" > 6TRUE입니다. 그것이 모든 행을 얻는 이유입니다.

data.table의 작동 방식에 대한 자세한 내용을 보려면 ?data.table 설명서를 읽어야합니다. 실제로는 꽤 좋습니다.

문제에 대한

,

d <- df[df[[var]] > x, ] 

df[[var]]

d <- df[var > x, ] 

을 대체 이름으로 목록 스타일의 부분 집합을 사용합니다.

+0

감사합니다. Nathan! 나는 data.table 문서를 검사 할 것이다. 나는 그것을 "지저분한"방법으로 배웠다. "get"솔루션에 문제가 있습니까? 다시 한 번 감사드립니다. – COLO

+0

'get'은 data.table 바깥에서도 볼 수 있으므로 예기치 않은 동작을 일으킬 수 있습니다. 예를 들어 변수'foo'가'test_OUT'에 할당되고 누군가가'var = "foo"'로 모듈을 호출하면'get (var)'는'foo'를 리턴하지만'df [[var]] 'NULL을 반환합니다. 덕분에 –

+0

. 말 되네. – COLO