一个简单的,但我相信有人知道如何做到这一点......
在R中,我在我的函数中寻找像 is.blank 这样的错误陷阱,其中用户可以指定日期或者它可以是空白,我们将默认使用今天的日期(即Sys.Date()
)
我试过
date.end <- ""
# then in function
if (date.end == "" || is.null(date.end)) {
message("end date not specified and so setting to today")
date.end <- Sys.Date()
} else {
# use the date.end passed in as Date class
}
但是这个检查吓坏了charToDate(),即
test.end == ""
Error in charToDate(x) :
character string is not in a standard unambiguous format
请告知如何检查基础R中的空白日期? (以及错误捕获日期的任何其他智慧......)
添加澄清:
大部分时间,该功能都会获得好日期,例如
date.end <- as.Date("31/03/2015", "%d/%m/%Y")
所以我不想改变课程。
但是,如果用户没有指定日期,你如何处理你想要默认的奇怪情况?
答案 0 :(得分:1)
使用NA
表示缺少的日期,然后将这些NA
替换为默认值:
date.end[is.na(date.end)] <- Sys.Date()
答案 1 :(得分:1)
请注意Sys.Date()
返回Date
类的对象。见class(Sys.Date())
。因此,当您将==
与character
进行比较时,Date
比较没有意义。
解决问题的一种方法是将Date
转换为character
:
date.end <- ""
# then in function
if (date.end == "" || is.null(date.end)) {
message("end date not specified and so setting to today")
date.end = as.character(Sys.Date())
}
##end date not specified and so setting to today
date.end == ""
##[1] FALSE
print(date.end)
##[1] "2015-04-01"
请注意,date.end
现在是character
。
编辑:彻底检修。好的,从阅读你的后续评论和问题看来,你想要的东西如下(尽管还不是很清楚)。
我认为你让它变得更复杂。首先,让我们创建一个可以处理单个(i)Date
的函数,(ii)可能格式错误的character
,或者(iii){{1}对象。
NULL
现在,让我们创建一个在日期列表中应用dateHandler <- function(x) {
if (is.null(x) || identical(x, "")) {
out <- Sys.Date()
} else {
x <- as.character(x)
out <- as.Date(x, format = "%Y-%m-%d")
if (is.na(out)) {
out <- Sys.Date()
}
}
return(out)
}
# Let's test it in a number of examples:
dateHandler("2014-02-21")
dateHandler(NULL)
dateHandler("21/03/1999") # Wrong format, returns today
dateHandler("")
dateHandler("2014-04-01")
dateHandler(Sys.Date())
的函数:
dateHandler
函数handleListOfDates <- function(list.of.dates) {
return(do.call(c, lapply(list.of.dates, dateHandler)))
}
# Let's test that:
test.data.list <- list("2014-05-01", NULL, "", Sys.Date(),
"2015-02-02", "1999-12-31", "")
#print(test.data.list) # See this
handleListOfDates(test.data.list)
# [1] "2014-05-01" "2015-04-01" "2015-04-01" "2015-04-01" "2015-02-02" "1999-12-31" "2015-04-01"
也会正确处理handleListOfDates
而不是vector
个日期。
希望这是你想要的。
答案 2 :(得分:0)
我试图使用人们的答案元素。喜欢@ tim-biegeleisen na想法作为指数。并从@aebilgrau和@csgillepsie打字。 NULL
只会造成麻烦:
is.null
返回一个TRUE / FALSE,因此您无法将其用作索引,例如is.na
所以这会让人费解!
library(data.table)
date.end.ok <- as.Date("31/03/2015", "%d/%m/%Y")
date.end.null <- NULL
date.end.blank <- ""
date.end.list <- list(date.end.blank, date.end.null, date.end.ok)
date.end.dt <- data.table("date"= date.end.list )
testdate <- function(date.end) {
# checks
# sort out any nulls first, replace with NA to not trip up |
# note null has length 0
if (length(date.end) <= 1) {
end.date.is.null <- is.null(date.end)
} else {
# sapply will not work on null or single value
# work along list (I am expecting input to be data.table column)
end.date.is.null <- sapply(date.end, is.null)
}
date.end[end.date.is.null] <- NA #replace with NA to not trip up |
end.date.is.bad <- (as.character(date.end) == "" |
end.date.is.null) #Thanks aebilgrau
# any problems found? any(end.date.is.bad)
if (any(end.date.is.bad)) {
message("end date not specified and so setting to today")
date.end[end.date.is.bad] <- as.Date(Sys.Date(),
"%d/%m/%Y") #Thanks tim-biegeleisen
} else {
# go with date.end given
}
#happy
return(date.end)
}
这种方法适用于列表和单个值。索引好的。 但不保留 As.Date类型!即返回
我想我可能会在r
中关注我的类型为NULL我没有把它放在原来的答案中,因为看起来太详细了。
已排序:请参阅 @aebilgrau 修改 datehandler 回答并为其+1!
答案 3 :(得分:-1)
你设置&#34; end.date&#34; &lt; - &#34;&#34;然后你测试&#34; date.end&#34;但它失败了。注意&#34;结束&#34;和&#34;日期&#34;在分配和测试中被翻转。
否则,end.date == ""
应该有效,或者您可以测试字符串nchar(end.date)
中的字符数,在您的情况下为零。
答案 4 :(得分:-1)
您可以使用与此类似的内容:
dplyr::mutate(Result = case_when(is.na.POSIXlt(DATE_var) ~ "<Alternative date_var or sys.date()>", TRUE ~ DATE_FINALIZADO))