2.10 HTML 위젯

R의 가장 큰 장점 중 하나는 데이터 시각화이지만 훨씬 풍부한 데이터 시각화를 위한 JavaScript 라이브러리가 많이 있습니다. 이러한 라이브러리는 웹 브라우저에서 쉽게 렌더링할 수있는 대화형 애플리케이션을 구축하는 데 사용할 수 있으므로 사용자는 시각화를 보기 위해 추가 소프트웨어 패키지를 설치할 필요가 없습니다.

이러한 JavaScript 라이브러리를 R로 가져 오는 한 가지 방법은 htmlwidgets 패키지 (Vaidyanathan et al. 2020)를 통하는 것입니다..

HTML 위젯은 독립형 웹 페이지 (예 : R 플롯)로 렌더링하거나 R Markdown 문서와 Shiny 애플리케이션에 포함할 수 있습니다. 원래 HTML 출력 전용으로 설계되었으며 JavaScript의 가용성이 필요하므로 LaTeX / PDF와 같은 비 HTML 출력 형식에서는 작동하지 않습니다. knitr v1.13 이전에서는 HTML 위젯을 HTML이 아닌 출력 형식으로 렌더링할 때 오류가 발생합니다. knitr v1.13부터 HTML 위젯은 webshot 패키지 (Chang 2019)를 통해 찍은 스크린 샷으로 자동 렌더링됩니다. 물론 webshot 패키지를 설치해야 합니다. 또한 PhantomJS (http://phantomjs.org)를 설치해야 합니다. 이는 webshot이 스크린 샷을 캡처하는 데 사용하는 것입니다. webshot과 PhantomJS는 모두 R에서 자동으로 설치할 수 있습니다.

install.packages("webshot")
webshot::install_phantomjs()

install_phantomjs() 함수는 Windows, OS X 및 Linux에서 작동합니다. 시스템 환경 변수 PATH를 수정하는 데 익숙하다면 PhantomJS를 직접 다운로드하여 설치할 수도 있습니다.

knitr가 코드 청크에서 HTML 위젯 개체를 감지하면 현재 출력 형식이 HTML 일 때 위젯을 정상적으로 렌더링하거나 위젯을 HTML 페이지로 저장하고 출력 형식이 HTML이 아닌 경우 webshot을 호출하여 HTML 페이지 화면을 캡처합니다. 다음은 DT 패키지 (Xie, Cheng, and Tan 2020)에서 생성된 테이블의 예입니다 :

DT::datatable(iris)

Figure 2.5: DT 패키지를 통한 테이블 위젯

지금 이 책을 웹 페이지로 읽고 있다면 위의 코드 청크에서 생성된 대화형 표를 볼 수 있습니다. 예를 들어 열을 정렬하고 표에서 검색할 수 있습니다. 이 책의 HTML이 아닌 버전을 읽는 경우 표의 스크린 샷이 표시되어야 합니다. 스크린 샷은 실제 웹 브라우저와 PhantomJS의 가상 브라우저의 차이로 인해 웹 브라우저에서 렌더링된 실제 위젯과 약간 다를 수 있습니다.

화면 캡처와 관련된 knitr 청크 옵션이 많이 있습니다. 첫째, 자동 스크린 샷의 품질이 만족스럽지 않거나 특정 상태 (예 : 표의 특정 열을 클릭하고 정렬 한 후)의 위젯 스크린 샷을 원하는 경우 수동으로 화면을 캡처할 수 있습니다. 청크 옵션 screenshot.alt (대체 스크린 샷)를 통해 자신의 스크린 샷을 제공합니다. 이 옵션은 이미지 경로를 사용합니다. 청크에 여러 위젯이 있는 경우 이미지 경로 벡터를 제공할 수 있습니다. 이 옵션이 있으면 knitr는 더 이상 webshot을 호출하여 자동 스크린 샷을 찍지 않습니다.

둘째, HTML 페이지에서도 실제 위젯을 렌더링하는 대신 knitr가 정적 스크린 샷을 사용하도록 강제하고 싶을 수 있습니다. 이 경우 청크 옵션 screenshot.force = TRUE를 설정할 수 있으며 위젯은 항상 정적 이미지로 렌더링됩니다. 여전히 자동 또는 사용자 지정 스크린 샷을 사용하도록 선택할 수 있습니다.

셋째, webshot에는 자동 스크린 샷을 제어할 수있는 몇 가지 옵션이 있으며,list(delay = 2, cliprect = 'viewport')와 같은 목록을 취하는 청크 옵션 screenshot.opts를 통해 이러한 옵션을 지정할 수 있습니다. 가능한 옵션의 전체 목록은 도움말 페이지 ? webshot::webshotpackage vignette vignette('intro', package = 'webshot')은 이러한 옵션의 효과를 보여줍니다. 여기서 delay 옵션은 렌더링하는 데 오랜 시간이 걸리는 위젯에 중요할 수 있습니다. delay는 PhantomJS가 스크린 샷을 찍기 전에 대기할 시간 (초)을 지정합니다. 불완전한 스크린 샷이 표시되면 더 긴 지연을 지정할 수 있습니다(기본값은 0.2 초).

넷째, 스크린 샷 캡처가 느리거나 코드 청크가 실행될 때마다 캡처하고 싶지 않은 경우 청크 옵션 cache = TRUE 를 사용하여 청크를 캐시할 수 있습니다. 캐싱은 HTML 및 비 HTML 출력 형식 모두에서 작동합니다.

스크린 샷은 fig.width, fig.height, out.width, fig.cap 등을 포함하여 그림과 관련된 많은 청크 옵션이 스크린 샷에도 적용된다는 점에서 일반 R 플롯처럼 작동합니다. 따라서 출력 문서에서 스크린 샷의 크기를 지정하고 그림 캡션도 할당할 수 있습니다. 자동 스크린 샷의 이미지 형식은 청크 옵션 dev를 통해 지정할 수 있으며 가능한 값은 pdf, png 그리고 jpeg 등입니다. PDF 출력의 기본값은 pdf이고 다른 유형의 출력은 png입니다. pdfpng 만큼 충실하게 작동하지 않을 수 있습니다. 때로는 HTML 페이지에 PDF 스크린 샷으로 렌더링하지 못하는 특정 요소가 있으므로 PDF 출력에도dev = 'png'를 사용할 수 있습니다. HTML 위젯의 특정 사례에 따라 다르며 어떤 형식이 더 바람직한 지 결정하기 전에 pdfpng (또는jpeg)를 모두 사용해 볼 수 있습니다.