【问题标题】:Non-numeric Argument to Binary Operator Error in RR中二进制运算符错误的非数字参数
【发布时间】:2015-04-16 04:37:42
【问题描述】:

我认为问题是如何输入 CurrentDay。它以前被创建为:

Transaction <- function(PnL, Day)
  results <- list(a = PnL, b = Day)
  return(results)

PnL 和 Day 都是数值。

Day <- Transaction(PnL, Day)["b"]

其中 Transaction 返回一个列表,b 是一个整数。

moving_avg <- function(StockData, MA, CurrentDay){
  #MA = Days long the MA is
  #CurrentDay = What day we are currently on
  MAValue <- NULL
  total <- 0
  start <- CurrentDay - MA
  for(i in 1:length(MA)) {
    total <- total + StockData[[start, 4]]
    start <- start + 1
  }
  MAValue <- total/MA
  return(MAValue)
}

有人知道我为什么会收到这个错误吗?

CurrentDay 中的错误 - MA:二元运算符的非数字参数

【问题讨论】:

  • 请包含示例数据并准确显示您是如何调用该函数的。见how to make a reproducible example
  • 函数没问题,你可能用非数字参数调用它。请提供可重现的样本,就像@MrFlick 所说的那样。
  • 我想我找到了问题,CurrentDay 是从我从列表中指定的变量中估算的。当我只打印 CurrentDay 时,我得到 $b [1] 41

标签: r


【解决方案1】:

因为你的问题是关于你的错误信息,而不是你的功能试图完成什么,所以我会解决这个错误。

- 是您的错误引用的“二元运算符”,CurrentDayMA(或两者)都不是数字。

二元运算是采用两个值(操作数)并产生另一个值(see wikipedia for more)的计算。 + 就是这样一个运算符:“1 + 1”接受两个操作数(1 和 1)并产生另一个值 (2)。请注意,生成的值不一定与操作数不同(例如,1 + 0 = 1)。

R 只知道如何将+(以及其他二元运算符,例如-)应用于数值参数:

> 1 + 1
[1] 2
> 1 + 'one'
Error in 1 + "one" : non-numeric argument to binary operator

当您看到该错误消息时,这意味着您(或您正在调用的函数是)尝试使用不是数字的东西执行二进制操作。

编辑:

您的错误在于使用[ 而不是[[。因为Day 是一个列表,所以使用[ 进行子集化将返回一个列表,而不是一个数字向量。但是,[[ 返回列表中包含的项目的类的对象:

> Day <- Transaction(1, 2)["b"]
> class(Day)
[1] "list"
> Day + 1
Error in Day + 1 : non-numeric argument to binary operator

> Day2 <- Transaction(1, 2)[["b"]]
> class(Day2)
[1] "numeric"
> Day2 + 1
[1] 3

Transaction,正如您定义的那样,返回两个向量的列表。上面,Day 是一个包含一个向量的列表。然而,Day2 只是一个向量。

【讨论】:

  • 查看我的代码,我的 Day 变量是否不是基于最初设置的数值?如果没有,我该怎么做才能做到这一点?
  • 我有一个类似的问题,只是我在尝试加入单独运行良好的图(箱线图和抖动图)时遇到了它。我的错误消息显示“p + o 中的错误:二进制运算符的非数字参数”。我应该为此创建一个单独的问题,还是应该在 cmets 中讨论这个问题?
  • @CannedMan 这在很大程度上是不相关的,但很容易解决。如果您想将它们放在一起,请使用par(mfrow = c(1,2)par(mfrow = c(2,1)。否则调用第一个情节,然后使用points() 或类似
  • “R 只知道如何将 +(和其他二元运算符,例如 -)应用于数字参数” - 小警告:除了在 ggplot(& ggmap 等)管道中,使用“+”像 %>% 管道。
  • @dez93_2000 真的!
【解决方案2】:

如果你在你的代码之前运行它,一切都会好起来的。

'+' <- function(e1, e2) {
  if (is.character(e1) | is.character(e2)) {
    paste0(e1, e2)
  } else {
    base::`+`(e1, e2)
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-15
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 2021-04-10
    • 2019-05-03
    相关资源
    最近更新 更多