R 函数在另一个函数中使用时返回一个常量
我有一个函数,它返回一些值的乘积。因此,在计算完所有值后,我使用了函数R 函数在另一个函数中使用时返回一个常量,r,function,ggplot2,R,Function,Ggplot2,我有一个函数,它返回一些值的乘积。因此,在计算完所有值后,我使用了函数prod,如果我使用带有一个特定值的函数,它就可以完美地工作。但是当我在一个区间上使用它时(例如,在下面的图中,使用geom_函数),函数给出一个常数,并带有一个警告 因此,我尝试在函数的每一步迭代产品,而不是在最后使用prod。它毫无预警地工作 我想知道你是否知道它为什么会这样 我加入你的形象(在链接)和代码,我用 library(tidyverse) library(patchwork) # Simulation de
prod
,如果我使用带有一个特定值的函数,它就可以完美地工作。但是当我在一个区间上使用它时(例如,在下面的图中,使用geom_函数),函数给出一个常数,并带有一个警告
因此,我尝试在函数的每一步迭代产品,而不是在最后使用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
库(tidyverse)
图书馆(拼凑)
#模拟德多涅斯
种子集(1993年)
vec问题在于,函数没有矢量化,而geom_函数
需要矢量化函数(请参见?geom_函数
),即当您在绘图代码中调用函数时,geom_函数
将横坐标
的向量传递给自定义函数。解决这个问题的一个办法是将你的函数矢量化,使它们在矢量上工作。下面的“快速而肮脏”方法在横坐标上循环:
avec\u prod欢迎使用堆栈溢出!打招呼往往不受鼓励。请记住,这个问题是要具有普遍性的,并且要尽量简短,尽量让他们感到气馁。有关更多信息,请参见此。这可能看起来没有人情味,但请记住,你可能不是唯一一个需要回答这类问题的人。谢谢你对此的澄清。没问题!这也是我当时找不到的链接。问候的问题引起了激烈的争论,双方都有很好的意见。我个人并不介意。无论如何,这不是问题所在。您最近的编辑是没有必要的-没有必要添加答案或“解决”的问题。通过接受答案,您已经标记了这一点!当您希望添加新信息时,请更改/更新问题,这些信息原本不是问题的一部分,可能有助于更好地理解您的问题。新年快乐。谢谢你的贡献。而且-这是一个很好的,问得很好的第一个问题!好的,非常感谢您的快速回答。呃——只是好奇您在哪里添加了“prod()”?@tjeboprod
在自定义函数produit1
中被调用。但我还没有将其包含在reprex中(或者最好将其删除)。(;是的,对。谢谢你的澄清。我承认,reprex标签有误导性,哈哈