Функция для создания кадра данных на основе пользовательского ввода в R - PullRequest
0 голосов
/ 06 февраля 2020

Простите, если этот вопрос базовый c, но я не могу найти подобный пример. Я относительно новичок в R и создании функций. У меня есть код, работающий без функции, но я хотел бы преобразовать его в код, который будет использоваться в Shiny

. Я пытаюсь разработать функцию, отражающую продолжительность обработки паразита в данный момент времени (это часть большей модели). Выходные данные представляют собой фрейм данных (называемый сигналом), где X = время, а Y =% убитых в это время паразитов (помечено как импорт).

Я хочу, чтобы функция позволяла пользователю вводить 1) время начала лечения 2) частоту лечения 3) промежуток времени между каждой обработкой. Так, например, пользователь может настроить лечение на 10000 дней, которые будут проводиться 4 раза с интервалом в 3 месяца. У меня это закодировано без такой функции:


#Initial vectors for days post treatment, % killed
x <- c(4, 30, 60, 90, 120, 210, 360) #days post treatment
z <- c(1.0, 0.99, 0.99, 0.79, 0.7, 0.02, 0) #% killed

#=============================================
#  fit data with logistic curve
#       -plot to check fit
#       -extract fit values using equation y = Asym / (1 + exp((xmid - input) / scal))
#=============================================
fit2 <- nls(z ~ SSlogis(x, Asym, xmid, scal), data = data.frame(x, z))
summary(fit2)

lines(seq(0, 400, length.out = 400),
      predict(fit2, newdata = data.frame(x = seq(0.5, 400, length.out = 400))))

Asym<-summary(fit2)$parameters[1,1]
xmid<-summary(fit2)$parameters[2,1]
scal<-summary(fit2)$parameters[3,1]

#=============================================
#      -create data frame "signal" that holds times and import (% killed at given time based on above)
#      -model population from additional code shows population doesn't reach equilibrium until 10000 # 
#        days, so start treatment after
#       This is where function would need to begin but using input from above

times <- seq(0, 20000, by = 1)
signal <- data.frame(times = times, import = rep(0, length(times)))

#Example of giving one treatment:
#   Treatment apply at 10000 days    
signal$import[c(10000:20001)] = (Asym / (1 + exp((xmid - times[0:10002]) / scal))



#==========GIVING 4 TREATMENTS, 3  MONTHS APART, STARTING AT 10000 DAYS===============#
signal$import[c(10000:10400, 10090:10490, 10108:10508, 10198:10598)] = (Asym / (1 + exp((xmid - times[c(0:401, 0:401, 0:401, 0:401)]) / scal)))  
#  Treatment 1 at 10000 days
#  Treatment 2 at 10120 days
#  Treatment 3 at 10240 days

#Plot the curve to verify the parasite treatment wearing off over time:
(plot(times,signal$import, xlim = c(9900, 14000),
     main="(Asym / (1 + exp((xmid - times)", cex.main=0.8, cex=0.5))

enter image description here

Я кодировал это вручную, чтобы убедиться, что длина импорта и векторы времени эквивалентны, но я хотел бы иметь возможность создать функцию, чтобы ее можно было поместить в приложение Shiny (вместе с остальной частью модели). Сюжет не важен для того, что мне нужно, но я подумал, что было бы полезно проиллюстрировать то, что я делаю.

Если у кого-нибудь есть какие-то предложения примеров, над которыми я мог бы поработать, или полезные ссылки, которые я мог бы проверить Я был бы очень признателен! Спасибо!

1 Ответ

1 голос
/ 06 февраля 2020

Самый простой способ начать работу с Shiny - это интерфейс flexdashboard:

flexdashboard: удобные интерактивные панели управления для R

Существует вспомогательный пакет пользовательского интерфейса widgets:

Пользовательские виджеты входов для Shiny

С помощью этих пакетов вы можете довольно легко создать интерфейс веб-модели и собирать пользовательские входные данные, используя спиннер или другой виджет ввода. В документации по flexdashboard также есть примеры того, как разместить фрейм данных на холсте.

Вы можете загрузить свою модель для тестирования на сайте shinyapps.io:

Поделитесь своими блестящими приложениями в Интернете

...