【问题标题】:Plotting piecewise functions in R在 R 中绘制分段函数
【发布时间】:2017-09-13 23:02:01
【问题描述】:

我正在尝试使用if 语句绘制下面的分段函数,并且我不断得到

Error: unexpected '}' in "}"

消息。我所有的牙套对我来说都很好,所以我不知道这是从哪里来的。这里的任何建议将不胜感激。 (另外,这基本上是我第一次在 R 中做这样的事情,所以请多多包涵)。

x.values = seq(-2, 2, by = 0.1)
n = length(x.values)
y.values = rep(0, n)
for (i in 1:n) {
x = x.values[i]
if (x <= 0) {
    y.values = -x^3
} else if (x <= 1) {
    y.values = x^2
} else {
    y.values = sqrt(x)
}   y.values[i] = y }

【问题讨论】:

  • 有什么你没有向我们展示的,因为当我运行你的代码时,它抱怨没有y。此外,您可能在一行上有两个}:请参阅我的答案。

标签: r


【解决方案1】:

这可以通过利用 R 函数通常是矢量化的事实来完成,而无需循环。

例如:

library(tidyverse)
theme_set(theme_classic())

dat = data.frame(x=x.values)

在基础 R 中,您可以:

dat$y = with(dat, ifelse(x <= 0, -x^3, ifelse(x<=1, x^2, sqrt(x))))

使用tidyverse 函数,您可以:

dat = dat %>% 
  mutate(y = case_when(x <= 0 ~ -x^3,
                       x <= 1 ~ x^2,
                       TRUE ~ sqrt(x)))

然后,绘制:

ggplot(dat, aes(x,y)) + geom_line() + geom_point()

【讨论】:

  • 我当然感谢您的回复,但练习的一部分实际上是在“for”循环中专门使用“if”语句来创建函数。 (也许我应该在 OP 中提到这一点......)
  • 因为这是一个作业,所以让我给你一个提示:如果你把y.values[i] = y }放在单独的行上,你的代码就会运行。但它不会给你你希望的结果。想想每次循环分配y.values = -x^3y.values = x^2 等时会发生什么。
  • 好的,所以,我已经尝试了几件事,并按照您的建议运行(不过,我仍然不确定为什么必须为 y. values[i] = y) 不断收到找不到“y.values”的错误。首先,“if”语句中的所有分配,我从“y.values”更改为“y.values[i]”(认为也许我需要为向量的每个元素分配值),但是得到了一样的问题。我还尝试强制使用条件句(所以,说 if (x>0 && x
  • R 不“喜欢看到”特定的订单。 y.values[i] = yy 的当前值分配给y.values 中的第i 个位置。 y = y.values[i]y.values 的第i 个位置的当前值分配给y。另请注意,在您的初始代码中,您在 if/else 语句之后运行了 y.values[i] = y,但 y 之前从未被创建或分配过值。
  • y.values[i] = y } 的单独行是为了避免在同一行上有两个 }(这是导致错误的原因)。
【解决方案2】:

当我确保换行符在正确的位置时,我不会收到有关意外符号的错误:

x.values = seq(-2, 2, by = 0.1)
n = length(x.values)
y.values = rep(0, n)
for (i in 1:n) {
  x = x.values[i]
  if (x <= 0) {
    y.values = -x^3
  } else if (x <= 1) {
    y.values = x^2
  } else {
    y.values = sqrt(x)
  }   
  y.values[i] = y 
}

但是,我得到的是 y 在最后一行不存在的投诉。

由于这是一个家庭作业,我将停止这个部分答案:P

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2012-05-14
    • 1970-01-01
    相关资源
    最近更新 更多