循环遍历R中的文本输入

Looping through text inputs in R

这个非常有用的平台上的所有才华横溢的人。我花了超过 12 个小时试图让它工作(是的,我并不聪明)。请帮助我。

我想遍历 'text input' 值(用户可以输入任意数量的代码)并将它们传递给我的 getSymbols.yahoo() 以便能够计算我的投资组合 returns.我还希望动态输入 getSymbols.yahoo() 中 'from' 参数中的日期。请有人帮助我。

这是我的代码:

library(quantmod)
library(PerformanceAnalytics)
library(imputeTS)
library(PortfolioAnalytics)
library(shiny)

ui<-fluidPage( 
 textInput("x","Enter tickers"),
 dateInput("dt", "Select a date:"),
 plotOutput("myplot")
              
)

server <- function(input, output){  
p <- reactive({
portfolioPrices <- NULL
for(ticker in 1:input$x) {
 portfolioPrices <- cbind(portfolioPrices,
                          getSymbols.yahoo(ticker, 
from=input$dt, periodicity = 'daily', auto.assign=FALSE)[,4])
}
})
portfolioReturns <- na.omit(ROC(p))

除了闪亮之外,这段代码看起来像

library(quantmod)
library(PerformanceAnalytics)
library(imputeTS)
library(PortfolioAnalytics)

tickers <- c("FB", "AAPL", "AMZN", "NFLX", "GOOGL")

portfolioPrices <- NULL
for(ticker in tickers) {
  portfolioPrices <- cbind(portfolioPrices,
                           getSymbols.yahoo(ticker, from='2016-01-03', periodicity = 'daily', auto.assign=FALSE)[,4])
}

portfolioReturns <- na.omit(ROC(portfolioPrices))

再一次,如果有人能帮助我,我将永远感激不已。

PS:我需要在 shiny 里面做这个。上面的 'outside shiny' 代码只是为了展示我正在尝试做的事情的要点。

您可以使用 strsplit 函数在 R 中循环以逗号分隔的文本输入,如下所示:

p <- as.character(unlist(strsplit(input$x, ",")))

之后,您可以遍历 p 并访问该向量中的每个元素。

for (i in p) {
      df <- cbind(df, getSymbols.yahoo(i, from = input$dt,  periodicity = "daily", auto.assign = F)[,4])
    }

这是我根据您的要求修改的代码:

library(quantmod)
library(PerformanceAnalytics)
library(imputeTS)
library(PortfolioAnalytics)
library(shiny)
library(DT)

ui<-fluidPage( 
  textInput("x","Enter tickers"),
  dateInput("dt", "Select a date:"),
  actionButton("GO","GO"),
  DT::dataTableOutput("table"),
  plotOutput("myplot")
  
)

server <- function(input, output){  
  df <- NULL
  data <- eventReactive(input$GO, {
    req(input$dt)
    p <- as.character(unlist(strsplit(input$x, ",")))
    for (i in p) {
      df <- cbind(df, getSymbols.yahoo(i, from = input$dt,  periodicity = "daily", auto.assign = F)[,4])
    }
    return(df)
    
  })
  
  output$table <- DT::renderDataTable({
    data()
  })
  
}

shinyApp(ui = ui, server = server)

P.s:请注意,当您使用 strsplit 时,它不会考虑两个值之间的任何空格。您必须传递输入文本,它们之间没有空格。 例如:amzn,aapl,fb 而不是 amzn, aapl, fb