R编程中的向量和函数

问题描述

我下面有一个函数,可让我获得数字的平方根。但是,我有一个要传递的向量,但是它只接受第一个元素,并给我输出“不可能”。没有人有任何想法我可以为这个函数做第二个数字并给我输出“不可能”的信息。谢谢!

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)