以代码作为输入的用户定义函数?

User defined function with ticker as input?

这是我现在的代码:

f=function(Symbol, start, end, interval){
  getSymbols(Symbols=Symbol, from=start, to= end)
  Symbol=data.frame(Symbol)
  
  a=length(Symbol$Symbol.Adjusted)
  b=a/interval
  c=ceiling(b)
  
  origData=as.data.frame(matrix(`length<-`(Symbol$Symbol.Adjusted, c * interval), ncol = interval, byrow = TRUE))
  

  return(origData)
 
}
f("SPY", "2012-01-01", "2013-12-31", 10)

接下来我需要获取调整后的收盘价,并仅将此价格数据用于后续任务。将每日股票调整收盘价拆分为 N 个块作为数据框中的行。这样每个块包含 M 天(列)的数据,其中 M 等于时间间隔值。在我的代码中它被称为 origData。 该函数应该 return 数据框 origData,但每当我尝试 运行 时,它都会告诉我 Symbol 数据框是空的。我需要如何更改函数才能获得数据帧输出?

我还没有弄清楚 data.matrix 调用中的表达式集应该做什么,您也没有努力解释您的意图。但是,您的错误发生在更远的地方。如果您对 str(Symbol) 进行调试调用,您将看到 Symbol 的计算结果为“SPY”,但这只是一个字符值,而不是 R 对象名称。你想要的对象被命名为 SPY 并且当你只能访问一个字符值时检索对象值的方法是使用 R 函数 get,所以尝试在里面的 getSymbols 调用之后添加这个函数:

 library(quantmod) # I'm assuming this was the package in use

  ...
      Symbol=data.frame( get(Symbol) )
      str(Symbol)  # will print the result at your console
      ....
      # then perhaps you can work on what you were trying inside the data.matrix call

您还会发现名称 Symbol.Adjusted 不起作用(因为 R 不是宏语言)。您需要执行以下操作:

 a=length( Symbol[[ paste0(Symbol, ".Adjusted")]] )

哦等等。您覆盖了 Symbol 的值。那行不通的。您需要为数据框使用不同的名称。那么你为什么不编辑你的问题来修复我到目前为止发现的错误并描述你在使用 as.data.frame.

时试图做什么

@IRTFM 的观察是正确的。结合这些更改,您可以将函数更改为:

library(quantmod)

f = function(Symbol, start, end, interval){
  getSymbols(Symbols=Symbol, from=start, to= end)
  data= get(Symbol)
  col = data[, paste0(Symbol, '.Adjusted')]
  a=length(col)
  b=a/interval
  c=ceiling(b)
  origData= as.data.frame(matrix(`length<-`(col, c * interval), 
                          ncol = interval, byrow = TRUE))
  return(origData)
}

f("SPY", "2012-01-01", "2013-12-31", 10)