Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中优化比较_R_Performance_Optimization_Comparison - Fatal编程技术网

在R中优化比较

在R中优化比较,r,performance,optimization,comparison,R,Performance,Optimization,Comparison,我对R编程还是新手,我需要优化代码的某些部分。我将在下面解释它是如何工作的 我当前的代码太慢了 一些解释 对于CURRENT的所有值(如1,2,3,4,5,…1000)调用此函数,我们希望在dt中为匹配dt$time==CURRENT的每一行更新$value,而且变量“varname”每CURRENT一次都会被修改 dt : a data.table ordered by time in the form of foo bar baz time related_var

我对R编程还是新手,我需要优化代码的某些部分。我将在下面解释它是如何工作的

我当前的代码太慢了 一些解释 对于
CURRENT的所有值(如1,2,3,4,5,…1000)
调用此函数,我们希望在
dt
中为匹配
dt$time==CURRENT
的每一行更新
$value
,而且变量“varname”每
CURRENT
一次都会被修改

dt : a data.table ordered by time in the form of
    foo   bar   baz   time   related_var   value
    1     1   "toto"  1      "varname"      NA
    1     2   "toto"  1      "varname"      NA
    2     1   "tata"  1      "varname"      NA
    2     8   "toto"  1      "varname"      NA
    ...

related_var : contain the name of a global data.frame which have its 
    colnames defined by baz in dt 
    rownames defined by a combination of foo & bar (foo_bar) in dt


example of "varname" variable:
          toto   tata
    1_1    1.6    2
    1_2    42   1337
    ...    ...    ...
    10_10    3.14   1.61
我已经做了一些更改(我在
数据.table
eval(parse(…)
)之前使用了
数据.frame
),但这仍然非常慢(对于约5000行的dt,大约5秒),如果您有想法(R或纯算法),我想知道如何优化它

注意,告诉我它是否太神秘了


编辑:我发现缓慢的部分是
dt$value[I]=get(dt$related\u var[I])[[linename,colname]]]
,如果我做一个简单的分配,比如
justAvar=get(dt$related\u var[I])[[linename,colname]]
,那么我现在的问题是:“R是如何通过索引的?如果我想进入index=15,R是否会遍历之前的所有14个元素?”

首先,我会预计算linename,我怀疑它几乎是为整个数据表计算的。将使用data.table引用魔法。第二,内联并简化函数。最后,使用data.table[I,j,by]方法

dt <- ...

dt[, linename := paste(foo, "_", bar, sep="")]

CURRENT <- 0
MAX     <- 1000
for(i in 1:MAX) {
    doSomeStuffOnGlobalVars()
    # get datas from global var for this CURRENT

    dt[time == CURRENT, value := get(related_var)[[linename, baz]]]
    CURRENT <- CURRENT + 1
}

乍一看,我认为您可以将这个-
linename=paste(dt$foo[I],“x”,dt$bar[I],sep=”“)
-移动到循环之外,因为
paste
[
是矢量化的。与优化无关,但将
CURRENT
作为参数传递给
myfunc
,而不是依赖作用域规则在父环境中找到它,这将更为惯用。据我所知,在函数内部根本不需要
for
循环(可能是最后一条语句,但即使是这条语句,也可以使用
mget
lapply
组合进行矢量化)。感谢linename的示例,它工作得很好,但当我尝试在
dt[time==CURRENT,value:=get(related\u var)中添加更多级别时,在级别2上出现了一个错误
递归索引失败[[尝试过其他级别][[linename,baz]]
有没有办法像
foo$bar$baz$toto$tata$lorem$['ipsum','dolor']]那样深入know@user3482164坦白地说,我不知道,现在似乎正在进行很好的讨论。您可能想继续,用代码/数据示例等问另一个问题
dt : a data.table ordered by time in the form of
    foo   bar   baz   time   related_var   value
    1     1   "toto"  1      "varname"      NA
    1     2   "toto"  1      "varname"      NA
    2     1   "tata"  1      "varname"      NA
    2     8   "toto"  1      "varname"      NA
    ...

related_var : contain the name of a global data.frame which have its 
    colnames defined by baz in dt 
    rownames defined by a combination of foo & bar (foo_bar) in dt


example of "varname" variable:
          toto   tata
    1_1    1.6    2
    1_2    42   1337
    ...    ...    ...
    10_10    3.14   1.61
dt <- ...

dt[, linename := paste(foo, "_", bar, sep="")]

CURRENT <- 0
MAX     <- 1000
for(i in 1:MAX) {
    doSomeStuffOnGlobalVars()
    # get datas from global var for this CURRENT

    dt[time == CURRENT, value := get(related_var)[[linename, baz]]]
    CURRENT <- CURRENT + 1
}
setkey(dt, time)