我的旧代码看起来像这样:
library(ggplot2)
gp<-ggplot(NULL,aes(x=Income))
gp<-gp+geom_density(data=dat$Male,color="blue")
gp<-gp+geom_density(data=dat$Female,color="green")
gp<-gp+geom_density(data=dat$Alien,color="red")
plot(gp) #Works
Run Code Online (Sandbox Code Playgroud)
现在我开始使用优秀的data.table库(而不是data.frame):
library(data.table)
cols<-c("blue","green","red")
gp<-ggplot(NULL,aes(x=Income))
dat[, list(gp+geom_density(data=.SD, color=cols[.GRP])), by=Gender]
#I even tried
dat[, list(gp<-gp+geom_density(data=.SD, color=cols[.GRP])), by=Gender]
plot(gp) #Error: No layers in plot
Run Code Online (Sandbox Code Playgroud)
我不确定是什么问题,但似乎我在J()中运行的代码在外部范围内没有得到识别.
我怎样才能以data.table惯用的方式实现这一目标?
我有一个父级和一个工作线程共享一个bool标志和一个std :: vector.父只读取(即读取bool或调用my_vector.empty()); 工人只写.
我的问题:
我需要互斥保护bool旗吗?
我可以说所有bool读/写都是固有的原子操作吗?如果您说"是"或"否",您从哪里获取信息?
我最近听说过GCC Atomic-builtin.我可以使用这些来使我的标志读/写原子而不必使用互斥锁吗?有什么不同?我理解Atomic builtins归结为机器代码,但即使是互斥体也归结为CPU的内存屏障指令吧?为什么人们将互斥锁称为"操作系统级别"构造?
我需要互斥保护我的std :: vector吗?回想一下,工作线程填充这个向量,而父对象只调用它上面的empty()(即只读取它)
我不相信bool或vector都需要互斥保护.我合理化如下,"好吧,如果我在更新之前读取共享内存...那仍然没问题,我将在下一次获得更新的值.更重要的是,我不明白为什么写入者应该被阻止阅读正在阅读,因为毕竟,读者只是在阅读!"
如果有人可以指出我正确的方向,那将是非常好的.我在GCC 4.3上,而Intel x86是32位.非常感谢!
布尔标志由两个线程切换.以下代码是否有意义?
static bool ATOMIC_BOOL_READ( volatile bool& var )
{
return __sync_fetch_and_or(&var, 0);
}
static void ATOMIC_BOOL_WRITE(volatile bool& var, bool newval )
{
__sync_bool_compare_and_swap( &var, !newval, newval);
}
Run Code Online (Sandbox Code Playgroud)
请注意以下几点:
我正在传递一个bool引用.合理?
为了一蹴而就,我也宣称它不稳定.
更新:
我想问的基本问题是:原子性和记忆障碍之间的区别是什么?如果线程A正在变量foo上执行原子内置,则线程B不能对变量foo执行任何操作; 因此创造了一个记忆障碍?
这是一个人为的例子(因此缺乏输出),但很简单(希望)能够证明我的问题.我想计算按"Country"和"FavoriteColor"分组的每个子组的mean()收入.
#For a single subgroup
mean(dat[J("Blue","Nigeria")]$Income) #dat is a data.table object
#For all the subgroups...in the output I obviously
#see the mean() for Blue/Nigeria subgroup. So far so good.
dat[,mean(Income),by=list((FavoriteColor,Country)]
Run Code Online (Sandbox Code Playgroud)
但现在,我不想只是mean(),而是想要子组的所有Income summary()统计信息.所以我只是......
#For a single subgroup
summary(dat[J("Blue","Nigeria")]$Income)
#For all the subgroups... but this doesn't do what I expect.
#It seems to computing something else entirely; I think
#its calling summary() on each row
dat[,summary(Income),by=list(FavoriteColor,Country)]
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?