library(quantmod)
last_price<-function(i){
for (i in stock_list)
price<-getQuote(i)
return(price$Last)
}
stock_list<-c("AAPL","TSLA")
last_price(stock_list)
嗨,伙计们,只是有一个函数从定义的股票列表中下载最后交易价格,在这种情况下,理想情况下,函数将返回APPLE的最后交易价格&特斯拉,但是,只有苹果的最后一个交易价格返回,很确定我写函数的方式有问题,介意帮我一下吗?如果我想让我的函数循环遍历列表,我错过了什么吗?非常感谢。
由于这是一个for
循环,并且price
在每次迭代中更新,因此它只返回最后一个。我们需要创建一个list
来存储输出。此外,函数的参数应该匹配。
last_price <- function(stock_list){
out <- vector('list', length(stock_list))
names(out) <- stock_list
for (stock in stock_list)
{
price_last<-getQuote(stock)$Last
out[[stock]] <- price_last
}
return(out)
}
测试
> price_list <- last_price(stock_list)
> str(price_list)
List of 2
$ AAPL: num 142
$ TSLA: num 179
不需要循环,因为getQuote
可以取值的向量
> getQuote(stock_list)
Trade Time Last Change % Change Open High Low Volume
AAPL 2022-12-09 16:00:04 142.16 -0.4899902 -0.3434912 142.34 145.56 140.91 76097011
TSLA 2022-12-09 16:00:04 179.05 5.6100006 3.2345480 173.84 182.50 173.36 104872336
> getQuote(stock_list)$Last
[1] 142.16 179.05
这是一个简单的sapply
解决方案。
suppressPackageStartupMessages(
library(quantmod)
)
last_price <- function(stock_list){
sapply(stock_list, (s) getQuote(s)$Last)
}
stock_list<-c("AAPL","TSLA")
last_price(stock_list)
#> AAPL TSLA
#> 142.16 179.05
创建于2022-12-11与reprex v2.0.2
编辑
看完akrun的答案后,如果你想让一个函数得到最后的价格,把他的矢量化的getQuote
解转换成一个函数。
last_price <- function(stock_list) {
setNames(getQuote(stock_list)$Last, stock_list)
}
last_price(stock_list)
#> AAPL TSLA
#> 142.16 179.05
创建于2022-12-11与reprex v2.0.2