我刚刚comment
在 R 中发现了这个函数。示例:
x <- matrix(1:12, 3,4)
comment(x) <- c("This is my very important data from experiment #0234",
"Jun 5, 1998")
x
comment(x)
这是我第一次来这个功能,想知道它有什么常见/有用的用途。由于在谷歌中搜索“R评论”并找到相关结果非常困难,我希望这里有人可以分享他的经验。
我刚刚comment
在 R 中发现了这个函数。示例:
x <- matrix(1:12, 3,4)
comment(x) <- c("This is my very important data from experiment #0234",
"Jun 5, 1998")
x
comment(x)
这是我第一次来这个功能,想知道它有什么常见/有用的用途。由于在谷歌中搜索“R评论”并找到相关结果非常困难,我希望这里有人可以分享他的经验。
第二个@Gavin,Frank Harrell 在他的Hmisc包中开发了有效的方法来处理 R 中的带注释的 data.frame 。例如,label()
andunits()
函数允许为 R 对象添加专用属性。我发现它们在生成 data.frame 的摘要时非常方便(例如,with describe()
)。
使用这种额外属性的另一种有用方法是在数据集上应用时间戳。我还为随机种子、折叠数(当我使用 k-kold 或 LOO 交叉验证时)添加了一个属性。
我经常发现自己在我的 R 脚本中为特定数据分析任务做的一件事是在脚本中包含关于我的数据帧中变量单位的注释。我与环境数据打交道,化学家和生态学家似乎喜欢对相同的事物使用各种不同的单位(mg L与亩当量 L, ETC)。我的同事通常将此信息存储在 Excel 工作表中列名正下方的行中。
我认为comment()
这是将此信息附加到数据框以供将来参考的好方法。
其他包中也有类似的功能,例如Stata 中的 -notes- 命令。我们使用它来记录变量的全部细节,例如生化测量的化验细节,或询问问卷数据的问题的准确措辞。对于变量名称或标签来说,这通常是太多的信息,其中一个或两个都显示在涉及变量的每个分析的输出中,因此最好保持合理的简短。
我发现自己经常做的一件事是跟踪用于生成数据和对象的命令,并且发现注释是一个有用的工具。
'matched.call.data' 和 'generate.command.string' 可以解决问题。不完美,但很有帮助并且可以用于“comment()”。:)
# Comments only accept strings...
# Substituting the escaped quotes ('\"') makes it prettier.
generate.command.string <- function( matched.call.data )
{
command.string <- as.character( bquote( .( list( matched.call.data ) ) ) )
sapply( bquote( .(command.string) ),
USE.NAMES=FALSE,
function( x )
gsub( "\\\"", "\'", as.list( match.call() )$x )[[2]] )
}
# Some generating function...
generate.matrix <- function( nrows, ncols, data=NA ) {
# Some generated object
mat <- matrix( data= data, nrow= nrows, ncol= ncols )
matched.call.data <- do.call( "call",
c( list( as.character( match.call()[[1]] ) ),
lapply( as.list( match.call() )[-1], eval ) ) )
comment( mat ) <- c( Generated= date(),
Command = generate.command.string( matched.call.data ) )
mat
}
# Generate an object with a missing argument.
emptyMat <- generate.matrix( nrows=2, ncols=2 )
comment( emptyMat )
# Generate without formally stating arguments.
dataMat <- generate.matrix( 2, 2, sample(1:4, 4, replace= TRUE ) )
comment( dataMat )
# And with a longer command.
charMat <- generate.matrix( 3, 3,
c( 'This', 'is', 'a', 'much', 'longer',
'argument', 'section', 'that', 'wraps') )
comment( charMat )
# And with a variable.
myData <- c( 'An', 'expanded', 'command', 'argument')
charMat2 <- generate.matrix( 2, 2, myData )
comment( charMat2 )
# Create a new object from an original command.
Sys.sleep(1)
emptyMat2 <- eval( parse( text= comment( emptyMat )[['Command']] ) )
dataMat2 <- eval( parse( text= comment( emptyMat )[['Command']] ) )
# Check equality of the static matrices.
identical( emptyMat, emptyMat2 )
# The generation dates are different.
all.equal( emptyMat, emptyMat2, check.attributes= FALSE )
comment( emptyMat )['Generated'] <- NA
comment( emptyMat2 )['Generated'] <- NA
identical( emptyMat, emptyMat2 )
# Command argument structure still works too.
str( as.list( match.call(
generate.matrix, parse( text=comment( charMat2 )[[ 'Command' ]] ) ) )[-1] )