循环遍历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
这个非常有用的平台上的所有才华横溢的人。我花了超过 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