【问题标题】:prod() function returns a constant number when used in another functionprod() 函数在另一个函数中使用时返回一个常数
【发布时间】:2021-01-08 11:14:56
【问题描述】:

我有一个函数可以返回一些值的乘积。所以我在计算了所有值之后使用了函数prod,如果我使用具有一个特定值的函数,它就可以完美地工作。但是当我在一个区间内使用它时(例如,在下图中,使用 geom_function),该函数会给出一个常数,并带有警告。

所以我尝试在函数的每一步迭代产品,而不是在最后使用 prod。而且它会在没有警告的情况下工作。

我想知道你是否知道它为什么会这样。

我加入你的图片(在链接中)和我使用的代码。

library(tidyverse)
library(patchwork)

# Simulation de données
set.seed(1993)
vec <- c(0.1, 0.2, 0.3, 0.4, 0.5)
index <- rbinom(n = 20, size = 4, prob = 0.4) + 1

# Fonction avec prod
produit1 <- function(vec, index, power) {
  probs <- numeric(length = length(index))
  for (i in seq_along(index)) {
    probs[i] <- vec[index[i]] * power
  }
  prod(probs)
}

# Fonction sans prod
produit2 <- function(vec, index, power) {
  probs <- 1
  for (i in seq_along(index)) {
    probs <- probs * vec[index[i]] * power
  }
  return(probs)
}

# Représentation graphique
abscisses <- seq(-1, 1, 0.1)
fct1_res <- numeric(length = length(abscisses))
fct2_res <- numeric(length = length(abscisses))
for (i in seq_along(abscisses)) {
  fct1_res[i] <- produit1(vec = vec, index = index, power = abscisses[i])
  fct2_res[i] <- produit2(vec = vec, index = index, power = abscisses[i])
}
avec_prod <- ggplot(data = NULL) +
  geom_line(aes(x = abscisses, y = fct1_res), color = "blue") +
  geom_function(fun = function(x) {produit1(vec = vec, index = index, power = x)}, color = "red") +
  labs(title = "Function with prod")
sans_prod <- ggplot(data = NULL) +
  geom_line(aes(x = abscisses, y = fct2_res), color = "blue") +
  geom_function(fun = function(x) {produit2(vec = vec, index = index, power = x)}, color = "red") +
  labs(title = "Function without prod")
avec_prod | sans_prod

每个函数的结果图

【问题讨论】:

  • 欢迎来到 Stack Overflow!问候往往是不鼓励的。请记住,这个问题应该是通用的,并且要保持简短并且不鼓励他们。有关更多信息,请参阅此Meta post。这可能看起来没有人情味,但请记住,您可能不是唯一需要解决此类问题的人
  • 感谢您对此的澄清。
  • 没问题!也是在Guidelines我当时只是找不到链接。
  • 问候这件事引起了激烈的争论,两者都有很好的意见。我个人不介意他们。无论如何,不​​是这里的问题。您最近的编辑不是必需的 - 无需在问题中添加答案或“已解决”。通过接受答案,您已经标记了这个!当您想要添加最初不是您问题的一部分并且可能有助于更好地理解您的问题的新信息时,请更改/更新问题。新年快乐。感谢您的贡献。
  • 另外 - 这是一个并且问得很好的第一个问题!

标签: r function ggplot2


【解决方案1】:

问题是你的函数没有向量化,而geom_function 需要一个向量化函数(参见?geom_function),即当你在绘图代码中调用你的函数时,geom_function 会将abscisses 的向量传递给你的自定义函数。他的问题的一种解决方案是将您的函数向量化,以便它们在向量上工作。下面的“快速而肮脏”的方法是在 abscisses 上循环:

avec_prod <- ggplot(data = NULL) +
  geom_line(aes(x = abscisses, y = fct1_res), color = "blue") +
  geom_function(fun = function(x) {
    y <- numeric(length = length(x))
    for (i in seq_along(x)) {
      y[i] <- produit1(vec = vec, index = index, power = x[i])
    }
    return(y)
  }, color = "red") +
  labs(title = "Function with prod")
sans_prod <- ggplot(data = NULL) +
  geom_line(aes(x = abscisses, y = fct2_res), color = "blue") +
  geom_function(fun = function(x) {
    y <- numeric(length = length(x))
    for (i in seq_along(x)) {
      y[i] <- produit2(vec = vec, index = index, power = x[i])
    }
    return(y)
  }, color = "red") +
  labs(title = "Function without prod")
avec_prod | sans_prod

reprex package (v0.3.0) 于 2021-01-08 创建

【讨论】:

  • erm --- 只是好奇你在哪里添加了“prod()”?
  • @tjebo prod 在自定义函数produit1 中被调用。但我没有包含在reprex 中(或者最好删除它)。 (;
  • 是的,没错。感谢您的澄清。 reprex 标签非常具有误导性,我承认大声笑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 2015-07-16
  • 2010-09-15
  • 1970-01-01
相关资源
最近更新 更多