1.4 Ana Panel ve Server(İşlem) Kısmına ait Fonksiyonlar
1.4.1 Ana Paneli Düzenlemek ve Çıktı Türleri
Kontrol düğmelerin tamamı “ui” olarak tanımlanan kullanıcı ara yüzünde “sidebarPanel” fonksiyonu içerisinde kullanılır. Hatırlayacağınız gibi “sidebarpanel” fonksiyonu kullanıcının etkileşime geçeceği kontrol düğmelerin tasarlandığı ve düzenlendiği kısımdır. Kullanıcı ara yüzünde yer alan ve analiz çıktılarının yer alacağı kısım “mainpanel” olarak adlandırılan ana paneldir. “mainPanel” kısmında öncelikli olarak analiz çıktısının türü belirlenir. Örneğin ana panelde çıktı olarak bir grafik mi veya çizelge mi olacağı bu kısımda belirlenir. Bu kısımda yer alabilecek farklı çıktı türleri olmakla beraber yaygın kullanılan bazıları aşağıda sunulmuş ve kısaca açıklanmıştır.
Bunlardan en sık kullanılanlardan birisi “plotOutput” fonksiyonudur ve ana ekranda çıktı olarak bir grafiğin olduğu durumlarda kullanılır. Örneğin “örnek 1” de sunulan shiny uygulamasında “mainPanel” kısmında “plotOutput” fonksiyonu kullanılmıştır.
mainPanel(
plotOutput( outputId= "grafik")
)
Yukarıda sunulan “plotOutput” fonksiyonu bir argüman içermektedir ve o da “outputId” olarak ifade edilen çıktı kimliğidir. Kontrol düğmelerinde ise bu argümanın muadili olarak “inputId” olarak adlandırılan girdi kimliği argümanının olduğunu hatırlayın. Ana paneli düzenlemek için kullanılan diğer fonksiyonlar da çıktı kimliğini tanımlayan “outputId” argümanını içerir. Burada tanımlanan çıktı kimliği “server” kısmında analiz çıktısının yapılandırılması sürecinde kullanılır. Çıktı kimliği olarak kullanıcı istediği bir ismi belirleyebilir. Yukarıdaki örnekte “grafik” ismi belirlenmiştir. Önemli olan çıktı kimliği için çok uzun olmayan ve akılda kalıcı isimler belirlemektir.
Ana panelde yaygın olarak kullanılan bazı çıktı türleri, kullanım amaçları ve server kısmında ilgili çıktı türünün uzantısı olarak kullanılan fonksiyonlar tablo 1’de özetlenmiştir.
Tablo 1
1.4.2 İşlem (Server) Kısmında Yer Alan Fonksiyonlar
Daha öncede belirtildiği gibi “ui” olarak adlandırdığımız kullanıcı ara yüzünde yazdığımız R shiny kodları ile “server” olarak adlandırdığımız işlem kısmında yazdığımız R kodlarını ilişkilendirmek gerekmektedir. Bu bağlamda “server” kısmında yer alan bazı fonksiyonlar ve kodlar ile bu iki boyutu ilişkilendiririz. Öncelikli olarak “server” kısmında yer alan ana fonksiyonlara değinelim.
İşlem (server) kısmı aslında başlı başına büyük bir fonksiyondan oluşur ve içerisinde başka fonksiyonları ve girdileri barındırır. İlk olarak bu fonksiyona bir isim verilir ancak daha önce de belirtildiği gibi iki bölüm (ui ve server) arasındaki ayrımın daha net anlaşılması için genellikle “server” ismi verilir. Bu kısmı daha net açıklamak için öncelikle hali hazırda oluşturulmuş bir kullanıcı ara yüzünü (ui) temel alalım. Çünkü “server” kısmı tamamen kullanıcı ara yüzünün nasıl yapılandırıldığı ve hangi girdi ve çıktı isimlerinin (inputId ve outputId) oluşturulduğuna bağlı olarak düzenlenir.
Bu örnek için psikometride gizil (psikolojik) özelliklerin ölçülmesinde madde parametreleri ile birey yeteneklerini aynı ölçek üzerinde ele alınmasına olanak tanıyan madde tepki kuramına dayalı basit bir örnek oluşturalım. Bu örnekte kullanıcı madde güçlük ve madde ayırt edicilik parametrelerini manuel olarak değiştirdiğinde madde karakteristik eğrisinde meydana gelen değişimi analiz çıktısı olarak oluşturalım. Aşağıda belirtilen işleme yönelik oluşturulmuş kullanıcı ara yüzü (ui) bölümü sunulmuştur.
library(shiny)
<-fluidPage(
uititlePanel("MTK 2 PL KESTİRİM"),
sidebarLayout(
sidebarPanel(
sliderInput(inputId="paramb", h3("güçlük (b) parametresi"), min=-3,max=3, step=0.1, value=0),
sliderInput(inputId="parama", h3("eğim (a) parametresi" ), min=-2.7,max=2.7, step=0.1, value=1)),
mainPanel(plotOutput(outputId= "grafik")) ))
<- function(input, output) { }
server shinyApp(ui = ui, server = server)
Yukarıda verilen “ui” kısmına uygun olarak “server” kısmının nasıl oluşturulacağı adım adım aşağıda ana hatları ile aşağıda açıklanmıştır.
1.4.3 Adım 1
<-function(input, output) {} server
Görüldüğü gibi ilk adımda fonksiyonun girdileri (input ve output) belirlenir. Burada iki girdi mevcuttur ancak başka girdilerin eklendiği durumlar da söz konusudur ve kitabın ileriki kısımlarına buna değinilecektir. İlk girdi “input” kullanıcı ara yüzünde (ui) “inputId” şeklinde belirlediğimiz girdi kimliklerini kullanarak ve iki bölüm arasında bağlantı kurarak analizlerin yapılmasını sağlar. Aynı şekilde “output” girdisi ise “outputId” olarak belirlediğimiz çıktı kimliklerini kullanarak analiz çıktısının oluşturulmasını sağlar. Oluşturduğumuz “ui” bölümünün üzerine “server” kısmını boş bir şekilde çalıştırırsak yukarıda yer alan kullanıcı ara yüzünü oluştururuz. Şimdi “server” kısmında oluşturduğumuz iki parantezin arasına gerekli analizlerin gerçekleştirileceği kodları yazıp “ui” kısmı ile ilişkilendirebiliriz.
1.4.4 Adım 2
Bu adımda ilk olarak analiz sonuçlarının hangi türde olacağına ilişkin belirlemeler yaptığımız “ui” kısmındaki “mainPanel” ile “server” arasındaki ilişkiyi kurarız. Hatırlayacağınız gibi “ui” kısmında analiz çıktısının grafik olacağını ”plotOutput” fonksiyonu ile belirtmiştik ve çıktı kimliği (outputId) olarak “grafik” ismini belirlemiştik.
<-function(input, output) {
server
$grafik<-renderPlot({ }
output}
Yukarıda yer alan output$grafik
tanılaması ile “ui” kısmındaki “mainPanel” ile bağlantı kurulur. Hatırlayacağınız gibi o kısımda çıktı kimliği olarak “grafik” ismini belirlemiştik. Bu kısımda ise “output$” ifadesi sonrasında “mainPanel” de oluşturduğumuz “grafik” çıktı kimliğini kullanarak iki bölümü ilişkilendiririz.
Yine yukarıda yer alan kodlarda “renderPlot” fonksiyonu ile ana panelde analiz çıktısının bir grafik şeklinde sunulacağı belirtilir. Aslında burada yazılan “renderPlot” fonklsiyonu “ui” kısmındaki “mainPanel” bölümünde belirtilen “plotOutput” komutu ile ilişkilidir. Eğer “mainPanel” bölümünde “tableOutput” komutu kullanılmış olsaydı burada “renderTable” fonksiyonunu kullanacaktık. Anlaşılacağı gibi tüm çıktı türleri için “server” kısmında “render” ile başlayan ve iki bölümü ilişkilendirmek için kullanılan fonksiyonlar mevcuttur (textOutput -> renderText, imageOutput-> renderImage vb.). Bu fonksiyonlara ilişkin biraz daha detaylı bilgiler ileriki bölümlerde sunulmuştur.
1.4.5 Adım 3
Üçüncü adımda ise “renderPlot” fonksiyonu ile açtığımız parantezlerin arasına gerekli grafiğin oluşturulması için R kodlarını yazarız. Ancak burada yazdığımız R kodlarının ve fonksiyonların girdileri olarak kullanıcı ara yüzünde kullanıcının işaretlediği seçenekleri veya değerleri kullanırız. Bunun için ise “ui” olarak adlandırdığımız kullanıcı ara yüzünde bulunan kontrol düğmeleri için belirlediğimiz girdi kimliklerinden (inputId) faydalanırız.
<-function(input, output) {
server$grafik<-renderPlot({
output<-seq(-3,3,0.1)
teta<- 1 /(1 + exp(-input$parama *(teta- input$paramb)))
Pplot(teta, P,type="l",col="blue",lwd=4,
main="MADDE KARAKTERİSTİK EĞRİSİ",xlab="Yetenek Düzeyi",
ylab="Doğru Yanıtlama Olasılığı" })
}
Yukarıda “renderPlot” fonksiyonu ile açılan parantezlerin arasına ilgili R kodları yazılmıştır. Bu kodlar madde tepki kuramına dayalı iki parametreli (madde güçlük ve ayırt edicilik parametresine sahip) logistik model için farklı yetenek düzeyindeki bireyler için bir soruyu doğru yanıtlama olasılıklarını kestirir ve buna dayalı olarak madde karakteristik eğrisi adı verilen bir grafik oluşturulur. Analiz çıktısı olarak sadece grafik gözükecektir ( çünkü önceki, bölümlerde analiz çıktısının grafik olacağını “plotOutput” komutu ve adım 2 de yazdığımız “renderPlot” fonksiyonu ile belirlemiştik).
Burada yazılan kodlar aslında oldukça basit olmakla beraber psikometri konusunda veya madde tepki kuramı konusunda ön bilgisi olmayan okuyuculara biraz karmaşık gelebilir. Okuyucuların asıl odaklanması gereken şey burada yazılan kodun çözümlenmesi değil “server” kısmında gerekli R kodlarının nereye yazıldığı ve “ui” kısmı ile nasıl ilişkilendirildiğidir.
Hatırlayacağınız gibi “ui” kısmında birinci kontrol düğmesinin girdi kimliği “paramb” idi ve bu madde güçlüğü değerine karşılık geliyordu. Diğeri ise madde ayırt ediciliği değerine karşılık gelen “parama” girdi kimliği idi. Görüldüğü gibi kodlar içerisinde input$parama
ve input$paramb
yazan kısımlarda kullanıcının ara yüzde işaretlediği değerler dikkate alınacak ve o değerlere dayalı grafik oluşturulacaktır. Bu bağlamda kullanıcı ilgili değerleri değiştirdikçe kodlar yeniden çalıştırılacak ve gerçek zamanlı olarak grafikte meydana gelen değişiklikler ekrana yansıyacaktır. Aşağıda adım adım yazdığımız kodlar birleştirilmiştir.
Bu kodu çalıştırdığınızda kullanıcı ara yüzünde “a” ve “b” parametreleri için yapılan değişiklikler gerçek zamanlı olarak grafiğe yansıyacaktır.
library(shiny)
<-fluidPage(
uititlePanel("MTK 2 PL KESTİRİM"),
sidebarLayout(
sidebarPanel(
sliderInput("paramb", h3("güçlük (b) parametresi"),
min=-3,max=3, step=0.1, value=0),
sliderInput("parama", h3("eğim (a) parametresi"),
min=-2.7,max=2.7, step=0.1, value=1) ),
mainPanel(plotOutput("plot")) ))
<- function(input, output) {
server $plot<-renderPlot({
output<-seq(-3,3,0.1)
teta<- 1 /(1 + exp(-input$parama *(teta- input$paramb)))
Pplot(teta, P,type="l",col="blue",lwd=4,
main="MADDE KARAKTERİSTİK EĞRİSİ",xlab="Yetenek Düzeyi",
ylab="Doğru Yanıtlama Olasılığı" )
})
}shinyApp(ui = ui, server = server)
Kodların çıktısına ilişkin bir görsel aşağıda sunulmuştur.