[英]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")
兩個問題:
從?print
'print'打印其參數並隱式返回(通過'invisible(x)')
因此,函數f
所做的所有事情就是將值打印到控制台(而不是返回值)。
根據您對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.