LLNAPI = function (){ nmax <- 10000; Nmax <- 30; y <- matrix(as.integer(runif(Nmax*nmax)<0.5), nrow=Nmax, ncol=nmax); z <- y; for (j in 1:Nmax) {z[j,] <- cumsum(y[j,])/(1:nmax);} require(tcltk); k <- tclVar(5); N <- tclVar(1); n <- tclVar(1000); distribution <- tclVar("bernoulli"); base <- tktoplevel(); tkwm.title(base,'Law(s) of Large Numbers'); tt <- tkframe(base, borderwidth=2) sliderFrame <- tkframe(tt, borderwidth=2, relief='groove'); NFrame <- tkframe(sliderFrame, borderwidth=2); NLabel <- tklabel(NFrame, text="Number of experiments", width=30); nFrame <- tkframe(sliderFrame, borderwidth=2); nLabel <- tklabel(nFrame, text="sample size", width=30); init <- function(){ for (j in 1:Nmax){ if (tclvalue(distribution)=="bernoulli"){ y[j,]<<-as.integer(runif(nmax)<0.5); } else{ y[j,]<<-rt(nmax, as.integer(tclvalue(k))); } z[j,] <<- cumsum(y[j,])/(1:nmax); } } replot <- function(N, n, ...){ ym <- 0; yM <- 1; if (tclvalue(distribution)=="student") {yM <- max(abs(z[1:N, ])); ym<- -yM;} plot(1:n, array(0, n), type="n", ylim=c(ym, yM), xlab="1:n", ylab="cumulative mean") for (j in 1:N){ lines(1:n, z[j, 1:n], type="l", col="blue", lwd=3, ...) } } controlPlot <- function(...){ if (tclvalue(distribution)=="student"){ tkconfigure(kSlider, state="normal", sliderrelief="raised"); } else{ tkconfigure(kSlider, state="disabled", sliderrelief="sunken"); } replot(as.integer(tclvalue(N)), as.integer(tclvalue(n))); } otherPlot <- function(...){ init(); controlPlot(); } NSlider <- tkscale(NFrame, from=1, to=Nmax, length=600, showvalue=T, variable=N, resolution=1, orient='horizontal', command=controlPlot) tkpack(NFrame, NLabel, NSlider, side='left'); nSlider <- tkscale(nFrame, from=50, to=nmax, length=600, showvalue=T, variable=n, resolution=50, orient='horizontal', command=controlPlot) tkpack(nFrame, nLabel, nSlider, side='left'); tkpack(sliderFrame, NFrame, nFrame, side='top') rbFrame <- tkframe(tt, borderwidth=2,relief='groove'); lbB <- tklabel(rbFrame, text='Bernoulli (1/2)'); rbB <- tkradiobutton(rbFrame, command=otherPlot); lbS <- tklabel(rbFrame, text='Student(k)'); rbS <- tkradiobutton(rbFrame, command=otherPlot); tkconfigure(rbB, variable=distribution, value='bernoulli'); tkconfigure(rbS, variable=distribution, value='student'); kFrame <- tkframe(rbFrame, borderwidth=2); kLabel <- tklabel(kFrame, text="Degrees of freedom", width=30); kSlider <- tkscale(kFrame, from=1, to=30, length=100, showvalue=T, variable=k, resolution=1, orient='horizontal', command=otherPlot) tkpack(kFrame, kLabel, kSlider, side='left'); tkpack(rbFrame, lbB, rbB, lbS, rbS, side='left'); tkpack(rbFrame, kFrame, side='right'); tkpack(tt, rbFrame, sliderFrame, side='top'); } LLNAPI();