以下代码在knitr代码块内部无法正常工作(它不会提取所需的子字符串):
可能导致此行为的原因是什么?
$Computers = Get-Content computername.txt
Get-WMIobject -Computername $Computers win32_service |
Where-Object {$_.startname -ne "LocalSystem" -and $_.startname -ne "localservice" -and $_.startname -notlike "*AUTHORITY*"} |
ft PSComputerName, name, startname, startmode, state |
Out-string |
Out-File ServiceReport.txt
月份[1]是
#Retrieve the earliest date
earlydate <- min(time(month[1]), "2016-04-20")
earlydate
#Extract YYYY-MM from earliest date
substr(earlydate, 1, 7)
期望在knitr输出中看到以下内容(R Markdown):
TSLA.Open TSLA.High TSLA.Low TSLA.Close TSLA.Volume TSLA.Adjusted
2016-02-16 158.7 162.95 154.11 155.17 5556300 155.17
#extracts the date:
time( month[1] )
2016-02-16
而不是提取实际输出,只显示原始文本:
## [1] 2016-02
但是,以下任一方法都能正常工作(提取YYYY-MM):
## [1] 2016-02-16
输出: ## [1] 2016-04
#inline r code
`r substr("2016-02-16", 1,7)`
输出: ## [1] 2016-04
课程详情 当两者都是参数时,键入日期
#knitr code chunk
```{r test, message=FALSE, warning=FALSE}
earlydate <- "2016-02-16"
earlydate
#Extract YYYY-MM from earliest date
substr(earlydate, 1, 7)
```
当一个是类型日期而另一个类型是&#34;字符&#34;
#Retrieve the earliest date
earlydate <- min(time(month[1]), as.Date("2016-04-20"))
class(earlydate)
## [1] "Date"
其他信息
环境
#Retrieve the earliest date
earlydate <- min(time(month[1]), "2016-04-20")
class(earlydate)
## [1] "Date"
substr函数似乎不会在闪亮的knitr Rmd文档中提取子字符串。
详细信息位于以下stackflow链接中:
Rscript - knitr: substr function not working correctly inside knitr code chunk
最小可重现示例(这不会提取所需的子字符串):
OS: Win7
RStudio Version 0.99.892
Rx64 3.2.4 (R version)
document type: shiny knitr doc (.Rmd)
Library: quantmod
Library: knitr
期待(这可以按预期工作):
substr( min( as.Date(2013-03-14), "2016-04-20"), 1,7)
outputs: ## [1] "2013-03-14"
它似乎与knitr无关,因为在R控制台上也可以看到这种行为。返回的类(如上所述)和数据处理似乎不相关。它似乎是潜在的 R问题 。
这是WAD吗?
BR / KK
答案 0 :(得分:2)
首先,要显示最小的自包含可重现示例的含义,这就是展示问题所需的全部内容:
x1 = as.Date('2013-03-14')
x2 = min(x1, '2016-04-20')
substr(x1, 1, 7) # "2013-03"
substr(x2, 1, 7) # "2013-03-14"
要调查此问题,请查看这些对象的实际内容:
dput(x1, '') # structure(15778, class = "Date")
dput(x2, '') # structure("15778", class = "Date")
x2
本质上是由类"15778"
屏蔽的字符串Date
。那是什么意思?我不知道(日期通常在内部表示为整数而不是字符)。它只是min()
返回的一个奇怪的对象,当你要求最小的日期和字符串时(我不知道这意味着什么,但R无论如何都会返回一些东西)。
为什么这个对象有问题?看一下substr()
的源代码:
> substr
function (x, start, stop)
{
if (!is.character(x))
x <- as.character(x)
.Internal(substr(x, as.integer(start), as.integer(stop)))
}
is.character(x2)
是TRUE
,因此它不会被强制转换为字符,然后传递给内部函数(可能会进一步传递给某个C函数),我不会去挖掘更深层次,因为现在的教训应该是清楚的:不要将苹果与橙子进行比较。例如,如果您想要最少两个日期,请确保两个值都是日期:
x2 = min(x1, as.Date('2016-04-20'))
另一种可能性是明确地将数据强制转换为某种类型,例如在这种情况下,您希望对字符串执行substr()
,因此请确保它确实是字符:
substr(as.character(x2), 1, 7)
无论哪种方式都能解决您的原始问题,但建议采用第一种方式。