0

我已经在 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 的向量,但是有没有办法绘制这个函数?

4

2 回答 2

2

我认为问题在于您的功能以及您期望它为您提供什么以及您编码的内容。

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

这是在函数中依赖全局变量的问题。

于 2013-01-09T00:22:45.430 回答
1

我想知道这是否是你想要的:

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

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

这也可能是您所期望的:

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

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

于 2013-01-09T00:28:09.077 回答