簡體   English   中英

在R中創建函數但獲得替換的長度為零錯誤

[英]Creating a function in R but getting a replacement has length zero error

我試圖創建一個函數f並創建該函數,所以當插入值x時,它會從y吐出函數f。但是,當我嘗試運行代碼進行繪圖時,它給我一個錯誤,指出我的y_value沒有長度。

f <- function(x){
  if (x<0){
   print(y_values<-x*x*x)
  }
  if(x>0 & x<=1){
    print(y_values<-x*x)
  }
  if(x>1){
    print(y_values<-sqrt(x))
  }

}


x_values <- seq(-2, 2, by = 0.1)
y_values <- rep(NA, length(x_values))
for (i in seq_along(x_values)) {
  x <- x_values[i]
  y_values[i] <- f(x)
}

# output
plot(x_values, y_values, type = "l")

兩個問題:

  1. ?print

    'print'打印其參數並隱式返回(通過'invisible(x)')

    因此,函數f所做的所有事情就是將值打印到控制台(而不是返回值)。

  2. 根據您對f的定義,該函數不知道如何處理x=0 因此,當您以后存儲f(0)的輸出時,這將產生問題。

我們可以通過稍微更改f為解決這些問題

    f <- function(x) {
      y_values <- NA
      if (x<0){
       y_values<-x*x*x
      }
      if(x>0 & x<=1){
        y_values<-x*x
      }
      if(x>1){
        y_values<-sqrt(x)
      }
      return(y_values)
  }

然后

x_values <- seq(-2, 2, by = 0.1)
y_values <- rep(NA, length(x_values))
for (i in seq_along(x_values)) {
  x <- x_values[i]
  y_values[i] <- f(x)
}

plot(x_values, y_values, type = "l")

在此處輸入圖片說明


您還可以使用Vectorize獲得向量化函數f2 ,該函數可以將x_values作為向量傳遞,從而避免顯式的for循環:

f2 <- Vectorize(f)
x_values <- seq(-2, 2, by = 0.1)
y_values <- f2(x_values)

結果圖是相同的。

我建議您探索其他編碼方法,例如:

這是一個不使用for循環的選項。 如果您只是在使用for循環,那么Mauritus Evers所做的修復應該適合您。

library(tidyverse)

data.frame(x_values = seq(-2, 2, by = 0.1)) %>% 
  mutate(y_values = case_when(x_values < 0 ~ x_values^3,
                              x_values>=0 & x_values<=1 ~ x_values^2,
                              x_values>1 ~ sqrt(x_values))) %>% 
  ggplot(aes(x_values, y_values)) + geom_point()

請注意,當x_value = 0時,我更改了代碼以產生輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM