我将每年的日期转换为日期,并且我注意到stage1PlayerSaved.health = 80;
stage1PlayerSaved.position = 50.3f;
stage1PlayerSaved.color = Color.Green;
通常会返回意外的结果(对我来说)。为什么对这些命令会得到不同的答案?
as.Date
返回as.Date(x = 1, format = '%j', origin= '2015-01-01')
"2018-07-21"
返回as.Date(x = 1, origin= '2015-01-01')
"2015-01-02"
返回as.Date(x = 1, format = '%j', origin= as.Date('2015-01-01'))
"2015-01-02"
返回as.Date(x = '1',format = '%j', origin= '2015-01-01')
"2018-01-01"
返回错误:as.Date(x = '1', origin= '2015-01-01')
答案 0 :(得分:2)
我尝试通过查看methods
下各种S3 generic as.Date
的定义,以及通过RStudio调试代码并查看称为函数的历史来部分回答以下问题
答案的底部提供了as.Date.numeric
,as.Date.character
和as.Date.default
的定义。
我定义了自己的函数check
来调试发生的情况。
check <- function() {
as.Date(x = 1, format = '%j', origin= '2015-01-01')
as.Date(x = 1, origin= '2015-01-01')
}
在第一个调用中,UseMethod
中的as.Date
被调用,并将其分派到as.Date.numeric
。依次调用as.Date(origin, ...)
,现在将其分派到as.Date.character
。如果您查看as.Date.character
的源代码,则条件if missing(format)
为FALSE,因为在这种情况下已提供了格式%j
。因此,被调用的代码段是strptime(x, format, tz = "GMT")
。这将返回2018-07-20 IST
,最后一次调用2018-07-20
会将其转换为as.Date
。请注意,时区可能因您所在的国家/地区而异。strptime
内部调用C函数,该函数无法使用此过程进行调试。
在第二个调用中,主要区别在于用户未提供格式字符串。因此,按照上面相同的过程,由于条件charToDate
为TRUE,因此调用的是在as.Date.character
内部而不是strptime
内部定义的函数if missing(format)
。在这种情况下,charToDate
尝试使用默认格式并在'%Y-%m-%d
中找到匹配项。在这种情况下,将为strptime
提供 correct 格式,并计算正确的值2015-01-01
。现在将其添加到x
中,该数字为1-记住字符版本是由代码为as.Date(origin, ...) + x
的数字版本调用的。这提供了正确答案。
虽然它不能完全回答您的问题,但通常的学习是它在很大程度上取决于传递给strptime
的格式字符串。希望这会有所帮助。
日期数字
function (x, origin, ...)
{
if (missing(origin))
stop("'origin' must be supplied")
as.Date(origin, ...) + x
}
日期字符
function (x, format, tryFormats = c("%Y-%m-%d", "%Y/%m/%d"),
optional = FALSE, ...)
{
charToDate <- function(x) {
xx <- x[1L]
if (is.na(xx)) {
j <- 1L
while (is.na(xx) && (j <- j + 1L) <= length(x)) xx <- x[j]
if (is.na(xx))
f <- "%Y-%m-%d"
}
if (is.na(xx))
strptime(x, f)
else {
for (ff in tryFormats) if (!is.na(strptime(xx, ff,
tz = "GMT")))
return(strptime(x, ff))
if (optional)
as.Date.character(rep.int(NA_character_, length(x)),
"%Y-%m-%d")
else stop("character string is not in a standard unambiguous format")
}
}
res <- if (missing(format))
charToDate(x)
else strptime(x, format, tz = "GMT")
as.Date(res)
}
默认日期
function (x, ...)
{
if (inherits(x, "Date"))
x
else if (is.logical(x) && all(is.na(x)))
.Date(as.numeric(x))
else stop(gettextf("do not know how to convert '%s' to class %s",
deparse(substitute(x)), dQuote("Date")), domain = NA)
}