R data.table 1.9.6在函数内通过引用(通过添加列)修改数据表时不一致

时间:2016-06-24 13:16:51

标签: r function scope reference data.table

我正在使用R 3.3.0和data.table 1.9.6。我试图通过引用使用assign-in-place(:=)运算符修改函数内的数据表。我得到的似乎是不一致的任务:

add_dt_cols <- function(DT, prefix, n=200) {
    for (varname in paste(prefix, 1:n, sep="")) {
        DT[, varname := 1:3, with=FALSE]
    }
    cat("INNER: ", colnames(DT), "\n")
}

testdt <- data.table(x = 1:3)
cat("OUTER: ", colnames(testdt), "\n")

add_dt_cols(testdt, prefix="a_")
cat("OUTER: ", colnames(testdt), "\n")

add_dt_cols(testdt, prefix="b_")
cat("OUTER: ", colnames(testdt), "\n")

输出:

OUTER:  x 

INNER:  x a_1 a_2 a_3 a_4 a_5 a_6 a_7 a_8 a_9 a_10 a_11 a_12 a_13 a_14 a_15 a_16 a_17 a_18 a_19 a_20 a_21 a_22 a_23 a_24 a_25 a_26 a_27 a_28 a_29 a_30 a_31 a_32 a_33 a_34 a_35 a_36 a_37 a_38 a_39 a_40 a_41 a_42 a_43 a_44 a_45 a_46 a_47 a_48 a_49 a_50 a_51 a_52 a_53 a_54 a_55 a_56 a_57 a_58 a_59 a_60 a_61 a_62 a_63 a_64 a_65 a_66 a_67 a_68 a_69 a_70 a_71 a_72 a_73 a_74 a_75 a_76 a_77 a_78 a_79 a_80 a_81 a_82 a_83 a_84 a_85 a_86 a_87 a_88 a_89 a_90 a_91 a_92 a_93 a_94 a_95 a_96 a_97 a_98 a_99 a_100 a_101 a_102 a_103 a_104 a_105 a_106 a_107 a_108 a_109 a_110 a_111 a_112 a_113 a_114 a_115 a_116 a_117 a_118 a_119 a_120 a_121 a_122 a_123 a_124 a_125 a_126 a_127 a_128 a_129 a_130 a_131 a_132 a_133 a_134 a_135 a_136 a_137 a_138 a_139 a_140 a_141 a_142 a_143 a_144 a_145 a_146 a_147 a_148 a_149 a_150 a_151 a_152 a_153 a_154 a_155 a_156 a_157 a_158 a_159 a_160 a_161 a_162 a_163 a_164 a_165 a_166 a_167 a_168 a_169 a_170 a_171 a_172 a_173 a_174 a_175 a_176 a_177 a_178 a_179 a_180 a_181 a_182 a_183 a_184 a_185 a_186 a_187 a_188 a_189 a_190 a_191 a_192 a_193 a_194 a_195 a_196 a_197 a_198 a_199 a_200 

OUTER:  x a_1 a_2 a_3 a_4 a_5 a_6 a_7 a_8 a_9 a_10 a_11 a_12 a_13 a_14 a_15 a_16 a_17 a_18 a_19 a_20 a_21 a_22 a_23 a_24 a_25 a_26 a_27 a_28 a_29 a_30 a_31 a_32 a_33 a_34 a_35 a_36 a_37 a_38 a_39 a_40 a_41 a_42 a_43 a_44 a_45 a_46 a_47 a_48 a_49 a_50 a_51 a_52 a_53 a_54 a_55 a_56 a_57 a_58 a_59 a_60 a_61 a_62 a_63 a_64 a_65 a_66 a_67 a_68 a_69 a_70 a_71 a_72 a_73 a_74 a_75 a_76 a_77 a_78 a_79 a_80 a_81 a_82 a_83 a_84 a_85 a_86 a_87 a_88 a_89 a_90 a_91 a_92 a_93 a_94 a_95 a_96 a_97 a_98 a_99 

INNER:  x a_1 a_2 a_3 a_4 a_5 a_6 a_7 a_8 a_9 a_10 a_11 a_12 a_13 a_14 a_15 a_16 a_17 a_18 a_19 a_20 a_21 a_22 a_23 a_24 a_25 a_26 a_27 a_28 a_29 a_30 a_31 a_32 a_33 a_34 a_35 a_36 a_37 a_38 a_39 a_40 a_41 a_42 a_43 a_44 a_45 a_46 a_47 a_48 a_49 a_50 a_51 a_52 a_53 a_54 a_55 a_56 a_57 a_58 a_59 a_60 a_61 a_62 a_63 a_64 a_65 a_66 a_67 a_68 a_69 a_70 a_71 a_72 a_73 a_74 a_75 a_76 a_77 a_78 a_79 a_80 a_81 a_82 a_83 a_84 a_85 a_86 a_87 a_88 a_89 a_90 a_91 a_92 a_93 a_94 a_95 a_96 a_97 a_98 a_99 b_1 b_2 b_3 b_4 b_5 b_6 b_7 b_8 b_9 b_10 b_11 b_12 b_13 b_14 b_15 b_16 b_17 b_18 b_19 b_20 b_21 b_22 b_23 b_24 b_25 b_26 b_27 b_28 b_29 b_30 b_31 b_32 b_33 b_34 b_35 b_36 b_37 b_38 b_39 b_40 b_41 b_42 b_43 b_44 b_45 b_46 b_47 b_48 b_49 b_50 b_51 b_52 b_53 b_54 b_55 b_56 b_57 b_58 b_59 b_60 b_61 b_62 b_63 b_64 b_65 b_66 b_67 b_68 b_69 b_70 b_71 b_72 b_73 b_74 b_75 b_76 b_77 b_78 b_79 b_80 b_81 b_82 b_83 b_84 b_85 b_86 b_87 b_88 b_89 b_90 b_91 b_92 b_93 b_94 b_95 b_96 b_97 b_98 b_99 b_100 b_101 b_102 b_103 b_104 b_105 b_106 b_107 b_108 b_109 b_110 b_111 b_112 b_113 b_114 b_115 b_116 b_117 b_118 b_119 b_120 b_121 b_122 b_123 b_124 b_125 b_126 b_127 b_128 b_129 b_130 b_131 b_132 b_133 b_134 b_135 b_136 b_137 b_138 b_139 b_140 b_141 b_142 b_143 b_144 b_145 b_146 b_147 b_148 b_149 b_150 b_151 b_152 b_153 b_154 b_155 b_156 b_157 b_158 b_159 b_160 b_161 b_162 b_163 b_164 b_165 b_166 b_167 b_168 b_169 b_170 b_171 b_172 b_173 b_174 b_175 b_176 b_177 b_178 b_179 b_180 b_181 b_182 b_183 b_184 b_185 b_186 b_187 b_188 b_189 b_190 b_191 b_192 b_193 b_194 b_195 b_196 b_197 b_198 b_199 b_200 

OUTER:  x a_1 a_2 a_3 a_4 a_5 a_6 a_7 a_8 a_9 a_10 a_11 a_12 a_13 a_14 a_15 a_16 a_17 a_18 a_19 a_20 a_21 a_22 a_23 a_24 a_25 a_26 a_27 a_28 a_29 a_30 a_31 a_32 a_33 a_34 a_35 a_36 a_37 a_38 a_39 a_40 a_41 a_42 a_43 a_44 a_45 a_46 a_47 a_48 a_49 a_50 a_51 a_52 a_53 a_54 a_55 a_56 a_57 a_58 a_59 a_60 a_61 a_62 a_63 a_64 a_65 a_66 a_67 a_68 a_69 a_70 a_71 a_72 a_73 a_74 a_75 a_76 a_77 a_78 a_79 a_80 a_81 a_82 a_83 a_84 a_85 a_86 a_87 a_88 a_89 a_90 a_91 a_92 a_93 a_94 a_95 a_96 a_97 a_98 a_99

因此内部函数正在修改外部作用域,但只将其添加的一部分复制回外部作用域。在这里,尝试从1列扩展到200列失败(总共100列),从200到200失败;我也见过例如228列应该扩展到231(或231处卡在231),当它应该多一些时,所以最大列数似乎不是可预测的常量。

这是以任何方式预期的,还是一个错误?

0 个答案:

没有答案
相关问题