【问题标题】:R: plotting a function, but "longer object length is not a multiple of shorter object length"R:绘制一个函数,但“较长的对象长度不是较短对象长度的倍数”
【发布时间】:2013-01-08 23:11:33
【问题描述】:

我已经在 R 中编写了这个简单的函数

> w=c(0.005,0.005,0.006,0.01,0.88,0.03,0.01,0.01,0.005,0.34,0.05)  
> trial<- function(a) {sum(a-w)}  
> trial(0.1)  
[1] 0.996

如您所见,如果我为 a 输入一个值,此函数可以正常工作,但是我想绘制它,并且与不涉及 sum 的函数不同,以下内容不起作用:

> plot(trial)

给我错误:

> Error in xy.coords(x, y, xlabel, ylabel, log) :  
  'x' and 'y' lengths differ  
In addition: Warning message:  
In a - w : longer object length is not a multiple of shorter object length

我知道 R 要求一个长度为 11 的向量,但是有没有办法绘制这个函数?

【问题讨论】:

  • 可能有更好的方法解决这个问题,但您可能想查看Vectorize
  • 您希望绘制什么?您的函数将始终返回单个值...
  • 您是否正在尝试做类似x &lt;- 1:10; plot(x,trial(x)) 的事情?
  • @贾斯汀。当 plot 用于不涉及“sum”的函数时,例如 trial
  • 没错。也许你想要类似的东西:x=as.list(1:10); plot(x, sapply(x, trial))

标签: r function plot


【解决方案1】:

我认为问题出在您的功能以及您期望它为您提供什么以及您编写的代码中。

sum(a-w) 将返回一个数字。

因此,当您传递一个向量时(正如 plot.function 方法和底层 curve 函数所做的那样,它会创建一个序列 seq(0,1,n=101)(默认情况下)。

现在您的函数在求和之前创建a-w。因此,只有当是单个值或与w 长度相同的向量时才有意义

trial(seq(0,1,length.out = 101))
[1] 38.331
Warning message:
In x - w : longer object length is not a multiple of shorter object length

它给出了答案,但警告你试图做一些可能很愚蠢的事情。

错误来自这样一个事实,即当 R 创建它正在创建的绘图时

plot(seq(0,1,length.out = 101), trial(seq(0,1,length.out = 101))

这会给你错误。

 Error in xy.coords(x, y, xlabel, ylabel, log) : 
 'x' and 'y' lengths differ

所以,问题是当给定a 的向量时,你希望你的函数返回什么

应该是a- sum(w)?在这种情况下,您应该重新定义您的功能以反映您想要的内容

trial2 <- function(a) {a - sum(w)}

然后

plot(trial2)

会给你一个很好的(如果有点无趣)直线

直到你重新定义w

w <- 'something else'

plot(trial2)
Error in sum(w) : invalid 'type' (character) of argument

在函数中依赖全局变量有什么问题。

【讨论】:

    【解决方案2】:

    不知道这是不是你想要的:

    trial<- function(x) {cumsum(x)}
    plot(seq_along(w),  trial(w), type="l")
    

    虽然只是猜测。如果这是正确的(即使它不是您想要的),那么有两个教训。 1)用自然语言充分描述问题; 2) 使用返回向量的函数。我认为cumsumcumprod 函数可能不会在介绍性文本中得到突出显示。在这种情况下,还有pminpmax,当新用户在最大和最小的努力中失败时,通常需要它们。

    这也可能是您所期望的:

    trial<- function(x) {cumsum(x-w)}
      plot(seq_along(w),  trial(0.1), type="l")
    

    一个更加参差不齐的情节结果。如果需要平滑,请搜索 smooth.spline

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      相关资源
      最近更新 更多