将is.numeric输出写入函数

将is.numeric输出写入函数,r,if-statement,boolean,R,If Statement,Boolean,我有一个非常简单的问题。我想创建一个函数,如果有一个正数值对象,则返回TRUE;如果没有,则返回FALSE;如果对象是一个字符向量,则返回“插入一个数字”。我写道: check.positive<-function(x){ if(all(x>=0)){ cat("TRUE") }else if(all(x<0)){ cat("FALSE") }else if(is.numeric(x)==FALSE){

我有一个非常简单的问题。我想创建一个函数,如果有一个正数值对象,则返回
TRUE
;如果没有,则返回
FALSE
;如果对象是一个字符向量,则返回
“插入一个数字”
。我写道:

check.positive<-function(x){
  if(all(x>=0)){
    cat("TRUE")
  }else if(all(x<0)){
    cat("FALSE")
  }else if(is.numeric(x)==FALSE){
    cat("Insert a number")
  }
}
check.positive=0){
猫(“真”)
}else if(全部)(x

改变顺序。请注意,
“A”>0
返回
TRUE
。这是因为在编程过程中,所有字符都被分配了一个数值,因此字符串只是一个数值向量(从编程的角度来看)。因此,所有类型检查都应该首先在函数中进行(这也是良好的编程实践):

check.positive=0))
猫(“真”)
else if(全部(x<0))
猫(“假”)
}

改变顺序。请注意,
“A”>0
返回
TRUE
。这是因为在编程过程中,所有字符都被分配了一个数值,因此字符串只是一个数值向量(从编程的角度来看)。因此,所有类型检查都应该首先在函数中进行(这也是良好的编程实践):

check.positive=0))
猫(“真”)
else if(全部(x<0))
猫(“假”)
}

谢谢大家。执行您的所有建议(返回结果,而不仅仅是打印、更改顺序等),我得到:


check.positive谢谢大家。执行您的所有建议(返回结果,而不仅仅是打印、更改顺序等),我得到:



check.positive您应该首先检查x是否为数字,因为比较只对数字变量有意义,而不是
为.numeric(x)=FALSE
,您可以简单地使用
!is.numeric(x)
。您说过要创建一个返回值的函数……但是您显示的代码不返回任何值,它只打印结果。(一般来说,这不是很有用;返回结果通常是您想要做的。)您应该首先检查x是否是数字,因为您所做的比较仅对数字变量有意义,而不是
是。数字(x)=FALSE
,您可以简单地使用
!is.numeric(x)
。您说过要创建一个返回值的函数……但是您显示的代码不返回任何值,它只打印结果。(一般来说,这不是很有用;返回结果通常是你想要做的。)在答案中添加文本来解释逻辑,对于回答问题的人和寻找类似问题解决方案的未来用户来说,这将非常有用。这并不需要太多,只有1-2行可以帮助一吨!在您的答案中添加文本来解释逻辑,对于回答问题的人和寻找类似问题解决方案的未来用户来说,这些文本将非常有用。这并不需要太多,只有1-2行可以帮助一吨!谢谢你,奥利弗,我不知道这会很有用的!一个简短的问题:我注意到你没有使用{}括号,有什么特别的原因吗?我试过了,有括号和没有括号都能用。我很乐意。它是特定于编程的。在R(和C++)中,如果语句只影响下一行(或当前行),则可以省略括号。例如
if(假)打印(“你好世界”);print(“我不是该语句的一部分”)
将只打印后者(
表示R中语句的结尾)。如果受
If
/
函数
语句影响的对象不止一个,则需要大括号。:-)注意:如果您有嵌套条件(如果有2个或更多的
if-else
),则可能会使人混淆。因此,总的来说,我建议严格使用括号。即使在你经历了几年之后,它也会导致非常令人困惑的(意想不到的)行为。非常感谢你的解释!谢谢你,奥利弗,我不知道这会很有用的!一个简短的问题:我注意到你没有使用{}括号,有什么特别的原因吗?我试过了,有括号和没有括号都能用。我很乐意。它是特定于编程的。在R(和C++)中,如果语句只影响下一行(或当前行),则可以省略括号。例如
if(假)打印(“你好世界”);print(“我不是该语句的一部分”)
将只打印后者(
表示R中语句的结尾)。如果受
If
/
函数
语句影响的对象不止一个,则需要大括号。:-)注意:如果您有嵌套条件(如果有2个或更多的
if-else
),则可能会使人混淆。因此,总的来说,我建议严格使用括号。即使在你经历了几年之后,它也会导致非常令人困惑的(意想不到的)行为。非常感谢你的解释!通常在“典型”中,R代码不会在
分支内部执行赋值,如果
分支,则在外部执行赋值。(即,
result=if(…)a else if(…)b else c
)。此外,这里不需要调用
return
函数,您可以直接返回结果。这反过来意味着
结果
变量是冗余的。因此,惯用的解决方案如下:
check_positive=function(x){if(!is.numeric(x))'insert a number'else if(all(x>=0))'TRUE'else'FALSE'}
-此外,通常,返回一个逻辑值比返回一个字符串更有帮助……但是如果返回一个逻辑值,则不清楚如何表示第一种情况。一种解决方案是返回
NA
。这最终取决于该函数的实际使用方式。最后一点注意:当函数名描述函数的功能时,它们更具可读性<代码>检查。肯定的
不太具有描述性<代码>为正更好(但它必须返回一个逻辑值,返回字符串会使该名称产生误导)。我想不出这个函数返回stri的好名字
check.positive<-function(x){
  if(is.numeric(x)){
    if(all(x>=0)){
      cat("TRUE")
    }else if(all(x<0)){
      cat("FALSE")}
  }else{
    cat("Insert a number")
  }
}
> check.positive("c")
Insert a number
> check.positive(1)
TRUE
> check.positive(-2)
FALSE
check.positive <- function(x){
  if(!is.numeric(x))
   cat("Insert a number")
  else if(all(x >= 0))
   cat("TRUE")
  else if(all(x < 0))
   cat("FALSE")
}

check.positive <- function(x){
  if(!is.numeric(x)){
    result<-"Insert a number"
  }else if(all(x >= 0)){
    result<-"TRUE"
  }else if(all(x < 0)){
    result<-"FALSE"
  }
  return(result)
}