R 如何建立快速定制德英词典

R 如何建立快速定制德英词典,r,dictionary,R,Dictionary,由于我的输入经常是德语,但我希望代码是纯英语,我希望有一个简短的自定义词典-基本上包括工作日-和月份缩写。因此,我想创建一个快速的英语-德语(反之亦然)词典-理想情况下作为一个具有父环境=.GlobalEnv的环境。 但是,当我将代码放入函数中时,dict\u g2e字典就不知道了 set_dict <- function() { # Delete this line and ... dict_g2e <- new.env(hash = TRUE, size = 7)

由于我的输入经常是德语,但我希望代码是纯英语,我希望有一个简短的自定义词典-基本上包括工作日-和月份缩写。因此,我想创建一个快速的英语-德语(反之亦然)词典-理想情况下作为一个具有
父环境=.GlobalEnv
的环境。 但是,当我将代码放入函数中时,
dict\u g2e
字典就不知道了

 set_dict <- function() { # Delete this line and ...
   dict_g2e <- new.env(hash = TRUE, size = 7)
   from <- c("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa")
   to <- c("Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat")
   for (i in 1:19) {
     assign(x = from[i], value = to[i], envir = dict_g2e)
   } # this line and the code is working as expected
微基准:

print(summary(microbenchmark::microbenchmark(
  g2e("So"),
  df_g2e("So"),
  times = 1000L, unit = "us")))
}
结果是:

       expr    min     lq      mean median     uq    max neval
   g2e("So")  1.520  2.280  2.434178  2.281  2.661 17.106  1000
df_g2e("So") 12.545 15.205 16.368450 15.966 16.726 55.500  1000

您可以使用一个闭包:

dict <- function() { # Delete this line and ...

  dict_g2e <- new.env(hash = TRUE, size = 7)
  from <- c("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa")
  to <- c("Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat")
  for (i in 1:19) {
    assign(x = from[i], value = to[i], envir = dict_g2e)
  }
  function(from) {
    dict_g2e[[from]]
  }
}

wdays1 <- dict()
wdays1("So")
#[1] "Sun"

如果要在两个方向上进行转换,使用data.frame将是自然的方法,但data.frame子集设置相当缓慢。您可以使用两个命名向量,每个方向一个。

您看过这个吗@user5249203:我的问题不是关于错误消息的预设翻译等等。所以我认为这不是我想要的(当然,在我没有得到的字里行间有一些东西)。我没有得到这个。为什么不直接使用命名向量呢
wdays(您在
set\u dict
中缺少一个结束
}
set\u dict
不返回
dict\u g2e
(它隐式返回
NULL
,因为最后一次求值是返回
NULL
帮助(“for”)
for
循环;您需要
返回(dict\u g2e)
并将其保存到变量:
dict\u g2e=set\u dict()
。如果你想遵循一个-在R中不常见的-副作用路径/从函数内部分配到全局环境,你只需要使用
dict_g2e@Roland:vector方法要慢得多,我想我可以使用一个简单而优雅的哈希方法来使用环境。我不知道
集合名
。此外,向量和环境之间的区别现在非常明显——有时你没有得到明显的区别;-)
       expr    min     lq      mean median     uq    max neval
   g2e("So")  1.520  2.280  2.434178  2.281  2.661 17.106  1000
df_g2e("So") 12.545 15.205 16.368450 15.966 16.726 55.500  1000
dict <- function() { # Delete this line and ...

  dict_g2e <- new.env(hash = TRUE, size = 7)
  from <- c("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa")
  to <- c("Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat")
  for (i in 1:19) {
    assign(x = from[i], value = to[i], envir = dict_g2e)
  }
  function(from) {
    dict_g2e[[from]]
  }
}

wdays1 <- dict()
wdays1("So")
#[1] "Sun"
wdays2 <- setNames(c("Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat"), 
                   c("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"))
wdays3 <- list2env(as.list(wdays2), hash = TRUE)

library(microbenchmark)
microbenchmark(for (i in seq_len(1e3)) wdays1("Mi"), 
               for (i in seq_len(1e3)) wdays2[["Mi"]], 
               for (i in seq_len(1e3)) wdays3[["Mi"]])

#Unit: microseconds
#                                    expr     min      lq     mean   median       uq      max neval cld
#   for (i in seq_len(1000)) wdays1("Mi") 434.045 488.205 520.6626 507.0265 516.2455 2397.108   100   c
# for (i in seq_len(1000)) wdays2[["Mi"]] 182.324 211.005 214.6720 215.9985 217.9190  239.173   100  b 
# for (i in seq_len(1000)) wdays3[["Mi"]] 141.609 164.143 167.1088 168.2410 169.7770  190.007   100 a 
wdays2[c("So", "Do")]
#     So      Do 
#  "Sun" "Thurs"