我是R的新手.我最近花了很多时间阅读Python中的所有内容如何成为对象,对象可以自己调用方法,方法是类中的函数,yada yada yada.
这是我不明白的.请使用以下简单代码:
mylist = [3, 1, 7]
Run Code Online (Sandbox Code Playgroud)
如果我想知道7号出现的次数,我可以这样做:
mylist.count(7)
Run Code Online (Sandbox Code Playgroud)
当然,这会返回1.如果我想将计数保存到另一个变量:
seven_counts = mylist.count(7)
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.除了语法之外,行为类似于R.但是,假设我正在考虑在我的列表中添加一个数字:
mylist.append(9)
Run Code Online (Sandbox Code Playgroud)
等一下,该方法实际上改变了变量本身!(即,"mylist"已被更改,现在包含数字9作为列表中的第四个数字.)将代码分配给新变量(就像我使用seven_counts一样)会产生垃圾:
newlist = mylist.append(9)
Run Code Online (Sandbox Code Playgroud)
我发现这种行为的不一致有点奇怪,坦率地说是不可取的.(假设我想先看看附加的结果是什么样的,然后可以选择决定是否要将其分配给新变量.)
我的问题很简单:
有没有办法事先知道调用特定方法是否会实际改变你的变量(对象)?
想象一下,我递给你一个乒乓球,上面印有"-1".然后我告诉你从一个标有"First Bag"的包中画另一个乒乓球.这个包有30,000个球,一些标有"-1",一些标有"0",有些标有"+1".无论你绘制哪个球,你都要将它的数字加到你当前的"得分"-1.例如,如果你画-1,你的新分数是-2.
只要您的新分数低于零,您就可以从第一个包中再次绘制并再次添加到您的分数中.但是,如果你的分数达到零或更高,你可以从第二个包中抽取,它具有-1s 0s和+ 1s的不同组成.
我希望你从相应的袋子里抽出1000个乒乓球(也就是说,取决于你当前得分是否低于零),然后在"套装"结束时记下你的总(累计)得分.然后我希望你重复这个实验一百万次并告诉我你得分的百分比高于零.
是否有更快/更有效的方法来编码?因为绘制不是独立的,所以很难对循环进行矢量化,尽管我可以使用一些组合ifelse和filter?我怀疑这是复制品,虽然是昂贵的部分.
ptm <- proc.time()
###First bag
n=30000
s=155
f=255
z=n-s-f
first_bag=c(rep(0,z), rep(1,s), rep(-1,f))
###Second bag
n2=30000
s2=275
f2=285
z2=n2-s2-f2
second_bag=c(rep(0,z2), rep(1,s2), rep(-1,f2))
###Simulate draws
sim_draw=function(draws){
score=-1
for (i in 1:draws) {
if (score < 0) {
score=score + sample(first_bag, 1, replace=TRUE)} else {
score=score + sample(second_bag, 1, replace=TRUE)}
}
score
}
###Repeat sims and find area above zero
samp_distribution=replicate(1000000, sim_draw(1000))
mean(samp_distribution>0)
print(proc.time() - ptm)
Run Code Online (Sandbox Code Playgroud)