Простите, если этот вопрос базовый 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))
Я кодировал это вручную, чтобы убедиться, что длина импорта и векторы времени эквивалентны, но я хотел бы иметь возможность создать функцию, чтобы ее можно было поместить в приложение Shiny (вместе с остальной частью модели). Сюжет не важен для того, что мне нужно, но я подумал, что было бы полезно проиллюстрировать то, что я делаю.
Если у кого-нибудь есть какие-то предложения примеров, над которыми я мог бы поработать, или полезные ссылки, которые я мог бы проверить Я был бы очень признателен! Спасибо!