问题描述
我下面有一个函数,可让我获得数字的平方根。但是,我有一个要传递的向量,但是它只接受第一个元素,并给我输出“不可能”。没有人有任何想法我可以为这个函数做第二个数字并给我输出“不可能”的信息。谢谢!
getRootNotVectorized <- function(x){
if(x<0)
return("not possible") else
return( sqrt(x))
}
getRootNotVectorized(c(-1,-4))
[1] "not possible"
解决方法
您可以将其矢量化:
/bin/sh -c 'while IFS= read -r line; do eval "$line"; done < ls'
我强烈建议让它返回缺失值getRootVectorized <- Vectorize(getRootNotVectorized)
getRootVectorized(c(-1,-4))
# [1] "not possible" "not possible"
(可以认为是数字),而不要返回NA
类的文本,例如"not possible"
。这样character
会很好地工作,并返回一个getRootVectorized(c(-1,4))
和一个数字。目前的情况是,NA
的答案将被强制为2
类,它没有什么用。
一种更有效的方法是使用已经矢量化的character
:
ifelse
尽管getRoot <- function(x) ifelse(x < 0,NA,sqrt(x))
基本上已经做到了这一点,但对于小于0的输入,返回sqrt
(不是数字)...因此您根本不需要其他函数。
代码的文字向量化将是:
getRootVectorized <- function(x){
return(ifelse(x<0,"not possible",sqrt(abs(x))))
#The abs is added to surpress warnings for negative values
}
但是,这不是一个好主意,因为向量的所有元素都必须是同一类型,因此,如果一个数字为负数,则将正数结果的值转换为字符。这就是为什么在标准NaN
函数中已将sqrt()
用于此函数的原因,该函数已经矢量化了,我敦促您使用内置函数,除非这只是一个学习的玩具示例。 / p>
例如
getRootVectorized(c(-1,1))
#[1] "not possible" "1"
与以下类型不同:
getRootVectorized(c(1,1))
#[1] 1 1
而:
sqrt(c(-1,1))
#[1] NaN 1
和
sqrt(c(1,1))
#[1] 1 1
返回相同类型
,您可以使用base
函数Vectorize
getrootVectorized <- Vectorize(getRootNotVectorized)
getrootVectorized(c(-1,-4))
[1] "not possible" "not possible"
,
R是向量化语言,因此您可以这样做:
ifelse(vec_to_sqrt > 0,as.character(sqrt(vec_to_sqrt)),"not possible")
数据:
vec_to_sqrt <- rnorm(100,mean = 5,sd = 3.5)