我已经有过几次了,所以这里是:我正在制作一些图表,其中包含一个参数估计值的曲线给定一个调整参数.
通常,我也为每个估计值都有SD,所以我可以在每个估计值周围显示误差条.
但是,我不喜欢错误栏,并且更喜欢它的一些平滑版本.这本身没问题(即我知道如何做到这一点).但是,我的情节包含几条相似的曲线,每条曲线都有自己的颜色.因此,我想将"平滑的错误区域"添加到每条曲线中,颜色与曲线本身的颜色相匹配.当然,我想透明地做到这一点,所以我仍然可以通过'错误区域'看到其他曲线.
所以,我的问题是:给定一种颜色(由数字,名称或rgb值指定---注意前两个会产生额外的问题,但这种情况经常发生,因为基本的绘图功能将这些作为有效颜色值),我怎样才能找到具有相同rgb但不同(给定)alpha级别(透明度)的匹配颜色.我想要一个像以下的功能:
makeTransparent<-function(someColor, alpha=100)
{
newColor<-someColor + alpha #I wish
return(newColor)
}
Run Code Online (Sandbox Code Playgroud)
这适用于以下事项:
makeTransparent(2)
makeTransparent("red")
makeTransparent(rgb(0,0,1))
Run Code Online (Sandbox Code Playgroud)
编辑当我想念一些明显的东西时,我讨厌它,但@themel指出了我(再次).这是一个完整的解决方案(注意:工作矢量化,因此您可以传递多种颜色;但此时仅支持一个alpha):
#note: always pass alpha on the 0-255 scale
makeTransparent<-function(someColor, alpha=100)
{
newColor<-col2rgb(someColor)
apply(newColor, 2, function(curcoldata){rgb(red=curcoldata[1], green=curcoldata[2],
blue=curcoldata[3],alpha=alpha, maxColorValue=255)})
}
Run Code Online (Sandbox Code Playgroud) 我想研究一下rcpp,以提高我的一些R代码的速度,而不必诉诸凌乱的C++代码(我已经取得了一些成功,但它看起来像是来自地狱的代码).
因此,我检查了Rcpp提供的文档,以及Dirk Eddelbuettel网站上提供的文档包.我安装并查看了RcppExamples,但是(至少从它的文档中)大多数都引用了RcppClassic?.除此之外,我做了一些谷歌搜索,但这并没有导致看起来像基本问题的答案.
operator()
和
operator[]
,但显然不是
operator[[]]
.目前尚不清楚哪些[]
与[[]]
R 相似.注意:事实上我从Rcpp-introduction.pdf的第一个例子中找到了一些答案,但这感觉就像运气.
此外,我stl
非常生疏,所以如果有人能给我一个简单的例子,其中List的每个元素都是(例如)print
-ed与stl风格的循环,那将是整洁的.
如果有人想因为没有找到这些信息而称我为白痴:继续前进,让你的一天.然后制作我的并指向我需要的文档:-)
作为对Eddelbuettel先生和其他Rcpp作者的建议(我希望他们中的一些人能够读到这一点):doxygen提供的类层次结构等,当你已经深入Rcpp时,它真的很整洁,但对于初学者来说(在Rcpp),我更感兴趣的是这个类中的这个方法的列表就像R中的那个函数一样,而不是'你可以在这个头文件中找到这个运算符的声明'.毕竟,我理解Rcpp的目标之一是降低在R中使用C++的门槛?注意:从我所看到和理解的内容来看,我非常重视Rcpp的实际代码,并对其创建者表示最高的敬意.如果缺乏基本文档仅仅是"缺乏资源"的结果,我愿意成为一种资源(例如:一旦我自己完成了"基本"文档的工作).
在文档中sapply
,replicate
有关于使用的警告...
现在,我可以接受它,但想了解它背后的原因.所以我创造了这个小小的人为例子:
innerfunction<-function(x, extrapar1=0, extrapar2=extrapar1)
{
cat("x:", x, ", xp1:", extrapar1, ", xp2:", extrapar2, "\n")
}
middlefunction<-function(x,...)
{
innerfunction(x,...)
}
outerfunction<-function(x, ...)
{
cat("Run middle function:\n")
replicate(2, middlefunction(x,...))
cat("Run inner function:\n")
replicate(2, innerfunction(x,...))
}
outerfunction(1,2,3)
outerfunction(1,extrapar1=2,3)
outerfunction(1,extrapar1=2,extrapar2=3)
Run Code Online (Sandbox Code Playgroud)
也许我已经做了一些明显可怕的错误,但我发现这个结果令人不安.所以任何人都可以向我解释为什么在上面的所有调用中outerfunction
,我得到了这个输出:
Run middle function:
x: 1 , xp1: 0 , xp2: 0
x: 1 , xp1: 0 , xp2: 0
Run inner function:
x: 1 , xp1: 0 , xp2: 0
x: 1 , xp1: 0 …
Run Code Online (Sandbox Code Playgroud) 当我查看电脑上的内容时[[.data.frame
,这就是我得到的:
> get("[[.data.frame")
function (x, ..., exact = TRUE)
{
na <- nargs() - (!missing(exact))
if (!all(names(sys.call()) %in% c("", "exact")))
warning("named arguments other than 'exact' are discouraged")
if (na < 3L)
(function(x, i, exact) if (is.matrix(i))
as.matrix(x)[[i]]
else .subset2(x, i, exact = exact))(x, ..., exact = exact)
else {
col <- .subset2(x, ..2, exact = exact)
i <- if (is.character(..1))
pmatch(..1, row.names(x), duplicates.ok = TRUE)
else ..1
.subset2(col, i, exact = exact)
}
}
<environment: namespace:base>
Run Code Online (Sandbox Code Playgroud)
我已经习惯了... …
我有一些自定义日志功能是扩展的cat
.一个基本的例子是这样的:
catt<-function(..., file = "", sep = " ", fill = FALSE, labels = NULL,
append = FALSE)
{
cat(..., format(Sys.time(), "(%Y-%m-%d %H:%M:%S)"), "\n", file = file,
sep = sep, fill = fill, labels = labels, append = append)
}
Run Code Online (Sandbox Code Playgroud)
现在,我使用(自制)函数进行了大量工作,并使用其中一些logfuntions来查看进度,这非常有效.但是,我注意到,我几乎总是使用这样的函数:
somefunc<-function(blabla)
{
catt("somefunc: start")
#do some very useful stuff here
catt("somefunc: some time later")
#even more useful stuff
catt("somefunc: the end")
}
Run Code Online (Sandbox Code Playgroud)
注意每个调用如何catt
从调用它的函数的名称开始.非常整洁,直到我开始重构我的代码并重命名函数等.
感谢Brian Ripley的一些旧的R-list帖子,如果我没弄错的话,我发现这段代码可以获得'当前的函数名':
catw<-function(..., file = "", sep = " ", fill = …
Run Code Online (Sandbox Code Playgroud) 我错过了一些明显的东西吗?看起来which
基数R中缺少反函数(谷歌搜索,甚至搜索SO的"R反向",它返回无数不相关的链接)?
好吧,并不是说我不能写一个,而只是为了减轻我对它的失望和作为一个R-肌肉屈曲挑战的挫折:你将如何写一个?
我们需要的是一个像以下的功能:
invwhich<-function(indices, totlength)
Run Code Online (Sandbox Code Playgroud)
返回一个长度为逻辑的向量,totlength
其中每个元素indices
都是TRUE
,其余元素是FALSE
.
必然会有很多方法来实现这一点(其中一些方法确实很低调),因此争论为什么你的解决方案是"最好的".Oneliner有人吗?
如果它考虑到which
(arr.ind
??)的一些其他参数,那显然更好......
我有一个数据框列表,我确信它们都至少包含一行(事实上,有些行只包含一行,其他行包含给定数量的行),并且它们都具有相同的列(名称和类型).如果重要的话,我也确定行中的任何地方都没有NA.
情况可以像这样模拟:
#create one row
onerowdfr<-do.call(data.frame, c(list(), rnorm(100) , lapply(sample(letters[1:2], 100, replace=TRUE), function(x){factor(x, levels=letters[1:2])})))
colnames(onerowdfr)<-c(paste("cnt", 1:100, sep=""), paste("cat", 1:100, sep=""))
#reuse it in a list
someParts<-lapply(rbinom(200, 1, 14/200)*6+1, function(reps){onerowdfr[rep(1, reps),]})
Run Code Online (Sandbox Code Playgroud)
我已设置参数(随机化),以便它们接近我的真实情况.
现在,我想在一个数据帧中统一所有这些数据帧.我认为使用rbind可以做到这一点,就像这样:
system.time(
result<-do.call(rbind, someParts)
)
Run Code Online (Sandbox Code Playgroud)
现在,在我的系统上(这不是特别慢),并且使用上面的设置,这需要system.time的输出:
user system elapsed
5.61 0.00 5.62
Run Code Online (Sandbox Code Playgroud)
rbind-ing 254(在我的情况下)200行变量的行近6秒?当然必须有一种方法来改善这里的表现?在我的代码中,我必须经常做类似的事情(这是来自多个插补),所以我需要尽可能快.
我总是无法理解有关如何调用S3方法的文档,而这次它正在咬我.
我会在前面道歉,提出不止一个问题,但他们都是密切相关的.在一系列复杂功能的核心深处,我创造了许多glmnet
契合,特别是后勤功能.现在,glmnet
文档指定其返回值以使类"glmnet"和(对于逻辑回归)"lognet".实际上,这些是按此顺序指定的.
但是,看看执行结束glmnet
后,调用(内部函数)之后的righter lognet
,将类设置fit
为"lognet",我在返回(变量fit
)之前看到这行代码:
class(fit) = c(class(fit), "glmnet")
Run Code Online (Sandbox Code Playgroud)
由此,我得出结论,类的顺序实际上是"lognet","glmnet".
不幸的是,我曾经拥有过(就像文档建议的那样):
> class(myfit)
[1] "glmnet" "lognet"
Run Code Online (Sandbox Code Playgroud)
这方面的问题是特别是为它调度S3方法的方式predict
.这是以下代码predict.lognet
:
function (object, newx, s = NULL, type = c("link", "response",
"coefficients", "class", "nonzero"), exact = FALSE, offset,
...)
{
type = match.arg(type)
nfit = NextMethod("predict") #<- supposed to call predict.glmnet, I think
switch(type, response = {
pp = exp(-nfit)
1/(1 + pp)
}, class = ifelse(nfit > 0, 2, …
Run Code Online (Sandbox Code Playgroud) 灵感来自Q6437164:有人可以向我解释为什么以下工作:
iriscopy<-iris #or whatever other data.frame
iriscopy$someNonExistantColumn[1]<-15
Run Code Online (Sandbox Code Playgroud)
对我而言,似乎并不明白R如何将此语句解释为:someNonExistantColumn
在data.frame中创建一个名为new的新列,并将第一个值(实际上是所有值,如图所示)设置为值15.
假设我有一个简单的多维结构,就像这样:
somestr<-array(sample.int(2, 120, replace=TRUE), dim=c(4,5,6))
Run Code Online (Sandbox Code Playgroud)
我正在寻找结构中的所有位置(在这种情况下,数组),其中值等于,例如,对于我的示例,2.请注意,结构可能同样包含字符或逻辑.现在,它只是找到所有与给定值相等的值,但将这个想法扩展到可以应用于结构中每个项目的任何逻辑值函数(这将允许例如is.na
使用)将是很好的..
我想得到的是一个(integer
)矩阵,其列数与somestr
维数一样多(在本例中为3),以及多行(取决于上面的sample.int调用),因为有等于给定值的值( 2).此新矩阵somestr
中的值是值等于2 的"坐标" .
我为将我的例子与解释混在一起道歉,但我希望这样更清楚.为了记录:我能够自己制作这个(甚至可以回答我自己的问题),但我希望有一个标准化的解决方案(阅读:在一些软件包中的现成功能),或者沿途学习新的技巧.
那么,总之,你能写一个函数吗?
posOf<-function(somestr, valueToCompareTo)
Run Code Online (Sandbox Code Playgroud)
返回somestr
等于的位置矩阵valueToCompareTo
,如果valueToCompareTo
是函数,则somestr
返回应用此函数返回的位置TRUE
.