Правильная реализация пользовательских функций в Shiny server.r - PullRequest
0 голосов
/ 05 ноября 2019

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

Когда я писал код локально, у меня есть три пользовательские функции: анализ возврата, визуализация и MCS с соответствующими входными данными. Первый, AnalysisofReturn принимает строку для ввода из списка («Ежедневно», «Еженедельно», «Ежемесячно», «Ежеквартально», «Ежегодно») и работает с ним оттуда. Если я могу понять, что я делаю неправильно в этом случае, я вполне уверен, что смогу реализовать две другие функции самостоятельно. Моим первым испытанием было отделить базовый код от ui.R и server.R, что не сработало. Затем я взял UDF в server.R, и он показал обещание. Насколько я понимаю, семейство функций рендеринга по умолчанию является реактивным, и поскольку используемая мной функция является UDF, мне нужно было перевести ее в реактивное состояние. В UDF я сделал вызов своему фрейму данных «myTable», так как должен был вызвать функцию, которая разрешила проблему поднабора, которую я получил. Я получил код, выполняющийся в один момент, когда я удалил UDF как таковой и выполнял операции отдельно, но в этом случае таблица не отображалась. Но это должно работать с UDF, так как я хочу создавать их в будущем, и я не хочу писать код, который дезорганизован. Я добавлю кусок набора данных при этом. Я использую Shinydashboard в качестве шаблона, который не имеет проблем с генерацией мне самой страницы.

Frequency   Date        ETF Index     Underlying Index

Daily       02/06/2009  60            1361.36
Daily       03/06/2009  56.41         1338
Daily       04/06/2009  57.27         1328.86
Daily       05/06/2009  55.72         1321.77

Weekly      05/06/2009  55.72         1321.77
Weekly      12/06/2009  58.38         1347.5
Weekly      19/06/2009  54.72         1305.8
Weekly      26/06/2009  54.74         1305.82

Monthly     30/06/2009  54.26         1307.16
Monthly     31/07/2009  65.28         1425.4
Monthly     31/08/2009  70.71         1498.97
Monthly     30/09/2009  76.18         1552.84

Quarterly   30/06/2009  54.26         1307.16
Quarterly   30/09/2009  76.18         1552.84
Quarterly   31/12/2009  77.99         1580.77
Quarterly   31/03/2010  79.96         1584.28

Yearly      31/12/2009  77.99         1580.77
Yearly      31/12/2010  85.23         1658.3
Yearly      30/12/2011  58.8          1412.55
Yearly      31/12/2012  79.11         1604

ui.R

dHeader <- dashboardHeader(title="Leveraged ETF")

dSidebar <- dashboardSidebar(

                            selectInput(
                              "Frequency",
                              label = h3("Frequency"),
                              choices = list("Daily" = "Daily", "Weekly" = "Weekly", "Monthly" = "Monthly", "Quarterly" = "Quarterly", "Yearly" = "Yearly"),
                              selected = "Yearly"),

                            selectInput(
                              "Task",
                              label = h3("Task"),
                              choices = list("Back Testing" = "backTesting", "Monte Carlo Simulation" = "monteCarloSimulation"),
                              selected = "Back Testing"),

                            conditionalPanel("input.Task=='backTesting'",
                                             selectInput("displayedOutputs",label=h3("Results"),
                                                         choices=list("First 9 values"="nineValues","Summary Statistics"="summaryStatistics","Charts"="charts"),
                                                         selected="First 9 values")),

                            conditionalPanel("input.Task=='monteCarloSimulation'",
                                             selectInput("displayedOutputs",label=h3("Results"),
                                                         choices=list("Simulations"="simulations","Simulation Graph"="simulationGraph"),
                                                         selected="Simulations"))

           )

dBody <- dashboardBody(tableOutput('Results')

)
ui <-     dashboardPage(dHeader,dSidebar,dBody)

server.R

server <- function(input, output, session) {
    #______________________________________________________________
    AnalysisofReturn <- function(Freq)                                          #Function to calculate all the relevant, time point-to-time point data
    {

        setwd("//SPVIPH07/testvip0002/03.Individual/Ramachandran/Shiny Practice")

        InputData <- as.data.frame(read.csv("Input/Dataset for R.csv",header=TRUE))

        myTable <- reactive({subset(InputData,ï..Frequency==Freq)})

        myTable()$ï..Frequency <- NULL

        myTable()$Date <- as.Date(myTable()$Date,format='%d/%m/%Y',origin="1970-01-01")

        myTable()$ETF.Return <- as.numeric(c("-",diff(log(myTable()$ETF.Index))))

        myTable()$Index.Return <- as.numeric(c("-",diff(log(myTable()$Underlying.Index))))

        myTable()$Multiple <- myTable()$ETF.Return/myTable()$Index.Return
        myTable()$Non.Regular.Movement <- ifelse(myTable()$Multiple<0,1,0)
        myTable()$Non.Regular.Positive.Movements <- ifelse(myTable()$Non.Regular.Movement==1 & myTable()$ETF.Return>0,1,0)
        myTable()$Absolute.Deviation.From.Ideal.In.Basis.Points <- round(abs(myTable()$ETF.Return-(2*myTable()$Index.Return))*10000,digits=0)


    }


    output$Results <- renderDataTable({AnalysisofReturn(input$Frequency)})


}

Я ожидаю, что на приборной панели отобразится таблица результатов. Но я получаю сообщение об ошибке

Предупреждение: Ошибка в <-: неверная (NULL) левая сторона назначения [Нет трассировки стека] </p>

1 Ответ

0 голосов
/ 05 ноября 2019

Вы должны быть в состоянии сохранить ваши оригинальные функции от вашего локального сценария. Сохраните их в файле global.R в том же каталоге, что и ваши server.R и ui.R. Затем они будут доступны для вашего блестящего приложения, и вы сможете упростить файл сервера до:

server <- function(input, output, session) {


    output$Results <- renderDataTable({AnalysisofReturn(input$Frequency)})


}

Глобальный файл будет выглядеть примерно так:

library(shiny)
library(shinydashboard)

AnalysisofReturn <- function(Freq)                                          #Function to calculate all the relevant, time point-to-time point data
{



    InputData <- as.data.frame(read.csv("Input/Dataset for R.csv",header=TRUE))

    myTable <- subset(InputData,Frequency==Freq)

    myTable$Frequency <- NULL

    myTable$Date <- as.Date(myTable$Date,format='%d/%m/%Y',origin="1970-01-01")

    myTable$ETF.Return <- as.numeric(c("-",diff(log(myTable$ETF.Index))))

    myTable$Index.Return <- as.numeric(c("-",diff(log(myTable$Underlying.Index))))

    myTable$Multiple <- myTable$ETF.Return/myTable$Index.Return
    myTable$Non.Regular.Movement <- ifelse(myTable$Multiple<0,1,0)
    myTable$Non.Regular.Positive.Movements <- ifelse(myTable$Non.Regular.Movement==1 & myTable$ETF.Return>0,1,0)
    myTable$Absolute.Deviation.From.Ideal.In.Basis.Points <- round(abs(myTable$ETF.Return-(2*myTable$Index.Return))*10000,digits=0)


}

Кроме того, вам не следуетнеобходимо установить рабочий каталог - пока ваши данные сохраняются в папке вашего приложения, именно там они и будут выглядеть, следовательно, read.csv(Input/Dataset for R.csv) выше.

...