R - if语句中未定义的真值

时间:2014-05-25 00:14:40

标签: r

用于通过if语句运行具有未定义真值的条件的"标准协议" 是什么?也就是说,我指的是length。我正在开发一个函数grep.dataframe,它将在数据框中提取(使用grep)或替换(使用gsub)值,而不必每次都写入循环。我在这里:

> dat <- data.frame(x = letters[1:3])
> grep.dataframe('f', dat)
# character(0) 

所以我决定添加一个if语句,以便grep.dataframe如果没有匹配(例如NULL)则返回更容易理解的内容。 if(length(d) == 0) NULL else d似乎很好。但这并不像if(is.integer(x))那样漂亮。考虑一下as.包中仅有159 is.base个函数。我无法找到适合这个问题的那个。那么,我的问题是,那些已发布的R开发人员如何在他们的代码中处理这种情况?

我想过这样做,我觉得这看起来并不坏。

has.length <- function(x)
{
    if(length(x) > 0) TRUE else FALSE
}

> has.length(character(0))
# [1] FALSE
> has.length(1)
# [1] TRUE

导致了

> df1 <- data.frame(x = 1)
> if(!has.length(df1)) NULL else df1
#   x
# 1 1
> df2 <- data.frame(x = numeric())
> if(!has.length(df2)) NULL else df2
# [1] x
# <0 rows> (or 0-length row.names)

工作(感谢@MrFlick进行更正)。 我想知道优雅的R开发人员这样做的方法。

干杯。

ADD:为了让人们知道我在做什么,这里有三个结果。这个功能现在很好用,因为agstudy的答案就行了。现在我必须要做的就是继承类。

> args(grep.dataframe)
function (pattern, X, sub = NULL, ...) 
NULL

> dat <- data.frame(x = letters[1:4], y = c('b', 'd', 'a', 'f'))
> grep.dataframe('a|f', dat)  ## returns a named list of values found by column
# $x
#   value row
# 1     a   1

# $y
#   value row
# 1     a   3
# 2     f   4

> grep.dataframe('a|f', dat, sub = 'XXX')  ## returns the gsub'ed data frame
#     x   y
# 1 XXX   b
# 2   b   d
# 3   c XXX
# 4   d XXX

> grep.dataframe('h', dat)
# NULL

1 个答案:

答案 0 :(得分:1)

我会做这样的事情:

 check_x <- function(x) if(length(x)) x else NULL
 x <- character(0)
 check_x(x)
 x <- 'a'
 check_x(x)
 [1] "a"

或者也只是省略退货:

check_x <- function(x) if(length(x)) x