【问题标题】:how to solve error non-numeric argument to binary operation如何解决二进制运算的错误非数字参数
【发布时间】:2021-07-04 15:58:56
【问题描述】:

我想计算股票收益,但出现错误

return=function(x)
  {
    n=length(x)
    x=matrix(x,nrow=n,ncol=1)
    return_data=matrix(nrow=n-1,ncol=1)
    for(i in 1:n-1)
    {
      return_data[i]=log(x[i+1,]/x[i,])
    }
    return_data
  }

R_JSMR=return(JSMR)

x[i + 1, ]/x[i, ] 中的错误:二元运算符的非数字参数

我该如何解决这个问题?请帮助我,非常感谢你:)

【问题讨论】:

  • JSMR的结构是什么?
  • 不要将你的函数命名为returnreturn 是用于构建函数的已定义函数。可能会发生可怕的事情...最好将其命名为 my_return 或类似的名称。
  • for(i in 1:n-1) 中缺少括号,应该是1:(n-1)。此外,这并没有错,但您没有使用x 矩阵结构,只有返回值。将x 强制转换为矩阵毫无意义。删除该指令并在循环中执行 log(x[i+1]/x[i]).

标签: r return


【解决方案1】:

错误是在1:n-1 中使用for 循环而不是1:(n-1)。这是修正后的函数及其矢量化版本。

log_returns <- function(x) {
  n <- length(x)
  return_data <- matrix(nrow = n - 1, ncol = 1)
  for(i in 1:(n-1)) {
    return_data[i] <- log(x[i+1]/x[i])
  }
  return_data
}
log_returns2 <- function(x) {
  return_data <- log(x[-1]/x[-length(x)])
  matrix(return_data, ncol = 1)
}

JSMR <- 1:10
R_JSMR <- log_returns(JSMR)
R_JSMR2 <- log_returns2(JSMR)
identical(R_JSMR,R_JSMR2)
#[1] TRUE

如果不需要返回矩阵,这里有两个单行。

log_returns3 <- function(x) log(x[-1]/x[-length(x)])
log_returns4 <- function(x) diff(log(x))

【讨论】:

    猜你喜欢
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 2021-07-18
    • 2020-09-15
    • 2018-01-20
    相关资源
    最近更新 更多