Julia Interact의 UI

7812 단어 julialangJulia
Julia에는 Interact라는 UI 라이브러리가 있습니다. 이 라이브러리는 Jupyter Notebook을 포함한 여러 환경에서 작동합니다. Jupyter에서 사용해 보았습니다.

Observable



Interact의 베이스에는 Observable이라는 객체가 있다. 이것은 Java의 동명 객체와 거의 같고, 업데이트되었을 때에 업데이트를 관측자에게 고지하는 역할을 갖는다. 다만, Java의 Observable과 같이 능동적으로 등록된 관측자의 메소드를 불러 가는 것이 아니라, 콜백 함수를 등록해 두는 훅과 같은 수동적인 역할 밖에 없는 것 같다.
using Interact
o = Observable(0)
on(v -> println("updated $v"), o)
on 함수에서 Observable이 업데이트 될 때 호출되는 함수를 등록합니다. 이러한 함수는 복수 등록 가능하다. Observable의 업데이트는 o[] = ...와 같이 []를 붙여 실시한다. o 를 갱신하면 등록한 콜백 함수가 호출된다.
> o[] = 1
updated 1

위젯



Interact의 Widget은 Observable입니다. 예를 들어 Button이면, 클릭된 횟수를 내부에 유지하고 있어 그것을 업데이트 하게 되어 있다.
using Interact

btn = button("push me!")
on(times -> println("pushed $times times!"), btn)
display(btn)

이 경우 버튼을 누를 때마다 메시지가 표시됩니다.



@map 매크로



복수의 Observable 중 하나가 갱신되었을 경우에 호출되는 함수를 등록할 수 있다. 표현식에 &를 붙인 것을 Observable로 해석한다. 위의 예에서는 Observable은 1개밖에 나오지 않지만 어디를 @map 매크로로 쓰면 다음과 같이 된다.
using Interact

btn = button("push me!")
Interact.@map println("pushed ", &btn, "times!")
display(btn)

Plots 사용



Plots 라이브러리를 사용하여 그래프를 업데이트할 수도 있다. 다음 코드는 Observable 변수 p 에 값을 순차적으로 더해, 그에 따라 그래프를 redraw 하고 있다. 값을 추가하는 함수 update@async 를 사용해 다른 태스크로 실행하고 있는 곳이 포인트.
using Interact
using Plots

p = Observable([])

function update()
    for i in 0:100
        p[] = append!(p[], sin(i * 2π /100))
        sleep(0.1)
    end
end

@async update()
Interact.@map plot(&p)



업데이트는 다른 태스크로 실행되므로, 이것을 실행하고 있는 동안도, 다른 셀에서는 완전히 다른 작업을 할 수 있는 곳도 포인트.

위젯과 플롯의 병용



Widget과 Plots와 다른 태스크를 병용하는 예로서 그래프의 Y축의 스케일을 동적으로 변경하는 예를 나타낸다. 별로 의미는 없지만.
using Interact
using Plots

p = Observable([0.0])
height = slider(1:0.1:2)

function update()
    for i in 0:100
        p[] = append!(p[], sin(i * 2π /100))
        sleep(0.2)
    end
end

@async update()
display(height)
Interact.@map plot(&p, ylims=(-&height, &height))

마지막 행에 & 가 붙은 변수가 복수 있는 것이 된장.



결론



Intract는 상당히 버전 업이 대단한 것 같고, 현재는 0.10.3이 최신. 아직 1도 되지 않아서 사용하는 것이 무섭지만, Julia는 대체로 이런 느낌이니까. .

좋은 웹페이지 즐겨찾기