有人应该已经问过这个,但我找不到答案.说我有:
x = data.frame(q=1,w=2,e=3, ...and many many columns...)
Run Code Online (Sandbox Code Playgroud)
将我不一定知道的位置的任意子列重命名为其他任意名称的最优雅方法是什么?
例如说我要重新命名"q"和"e"成"A"和"B",什么是最优雅的代码来做到这一点?
显然,我可以做一个循环:
oldnames = c("q","e")
newnames = c("A","B")
for(i in 1:2) names(x)[names(x) == oldnames[i]] = newnames[i]
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更好的方法?也许使用一些包?(plyr::rename等)
我写了一个表单的递归函数
foo=function(vars,i=2){
**do something with vars**
if(i==length(vars)){
return(**something**)
}else{
foo(vars,i+1)
}
}
Run Code Online (Sandbox Code Playgroud)
length(vars) 是1500左右.当我执行它时,我得到了错误
Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
Error during wrapup: evaluation nested too deeply: infinite recursion / options(expressions=)?
Run Code Online (Sandbox Code Playgroud)
很公平,所以我增加了
options(expressions=10000)
Run Code Online (Sandbox Code Playgroud)
然后它工作.
但是,当我读到的帮助文档options有关expressions=,我只是不明白它在说什么.此外,它表明
...如果你增加它,你可能还想用更大的保护堆启动R; ...
所以有人可以告诉我发生了什么,如果我应该expressions像我一样增加参数,以及我是否应该修改其他内容.
假设我有一个函数,它接受一些参数k并返回另一个带参数n但k在函数体中使用的函数.
makeFn <- function(k) {
function(n){
rep(k,n)
}
}
five <- makeFn(5)
five(3)
# [1] 5 5 5
body(five)
# {
# rep(k, n)
# }
Run Code Online (Sandbox Code Playgroud)
我怎样才能打印出five它所显示的身体rep(5,n)而不是rep(k,n)?
我尝试编译 YiHui 的 BIG5示例(带有中文内容的 knitr)。我使用了 Mac OSX snowleopard、最新的 RStudio、pdfLatex(结果与 XeLatex 相同)。这是原始 .Rnw 的摘录
\begin{document}
\title{knitr???????}
\author{???}
??????????????
<<test>>=
1+1 # ????
'??????'
rnorm(5)
(function(){
paste('??????')
})()
@
Run Code Online (Sandbox Code Playgroud)
使用系统默认编码“UTF-8”,生成的 pdf 是
1+1 #
## [1] 2
''
## [1] ""
rnorm(5)
## [1] -0.4290 1.8835 -0.7045 -0.9232 1.5433
(function(){ paste('') })()
## [1] ""
Run Code Online (Sandbox Code Playgroud)
如您所见,中文只是空白区域。然后我用 BIG5 编码保存了 .Rnw 并再次编译。生成的pdf变成:
AyyCHUNXaH
1+1 # F
## [1] 2
'H'
## [1] "H"
rnorm(5)
## [1] -0.27859 -0.79428 -0.76903 0.40313 -0.07851
(function(){ …Run Code Online (Sandbox Code Playgroud) 我有一个很难R做的计算,我可以选择2台计算机,叫做V和L,来运行代码.V应该比L快,但我没有遇到过这种情况.所以我决定测试一下.
作为一个简单的测试,我决定让他们倒转3000*3000的matrice 500次,然后记录时间.
set.seed(123)
I=500
n=3000
time=matrix(NA,ncol=3,nrow=I)
for(i in 1:I){
t0<-proc.time()
x<-solve(matrix(runif(n^2),n))
mt1<-proc.time()
time[i,]<-(mt1-t0)[1:3]
}
Run Code Online (Sandbox Code Playgroud)
问题是在特定的迭代期间,它被卡住了.我不知道为什么,但我怀疑是因为生成的矩阵接近奇异.所以我想改进代码.我可以想到三种方式:
R如果solve花费太长时间,请跳过该迭代?但同样,我该怎么做?