【问题标题】:Vector and Function in R programmingR编程中的向量和函数
【发布时间】:2020-09-15 13:22:34
【问题描述】:

下面有一个函数可以得到一个数字的平方根。但是,我有一个要传入的向量,但它只需要第一个元素并给我一个“不可能”的输出。有没有人知道我可以为这个函数做些什么来获取我的第二个数字并给我一个“不可能不可能”的输出。谢谢!

getRootNotVectorized <- function(x){
    if(x<0)
        return("not possible") else
            return( sqrt(x))
}

getRootNotVectorized(c(-1, -4))
[1] "not possible"

【问题讨论】:

    标签: r vectorization


    【解决方案1】:

    你可以矢量化它:

    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))
    

    虽然 sqrt 基本上已经这样做了,但对于小于 0 的输入返回 NaN(不是数字)......所以你根本不需要其他函数。

    【讨论】:

      【解决方案2】:

      您的代码的文字矢量化将是:

      getRootVectorized <- function(x){
          return(ifelse(x<0,
                        "not possible",
                         sqrt(abs(x))))
                         #The abs is added to surpress warnings for negative values
      }
      

      但是这不是一个好主意,因为向量的所有元素都必须是同一类型,因此如果一个数字为负数,则正数结果的值将转换为字符。这就是为什么 NaN 在标准的 sqrt() 函数中用于此目的,该函数已被矢量化,我强烈建议您使用内置函数,除非这只是一个用于学习的玩具示例。

      例如

      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
      

      返回相同的类型

      【讨论】:

      • 感谢您的建议!
      【解决方案3】:

      您可以使用base 函数Vectorize 对标量函数进行矢量化处理

      getrootVectorized <- Vectorize(getRootNotVectorized)
      getrootVectorized(c(-1, -4))
      [1] "not possible" "not possible"
      

      【讨论】:

      • 感谢您的建议!
      【解决方案4】:

      R 是一种矢量化语言,所以你可以这样做:

      ifelse(vec_to_sqrt > 0, as.character(sqrt(vec_to_sqrt)), "not possible")
      

      数据:

      vec_to_sqrt <- rnorm(100, mean = 5, sd = 3.5)
      

      【讨论】:

      • 感谢您的建议!
      猜你喜欢
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      相关资源
      最近更新 更多