用于通过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
答案 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