小编use*_*796的帖子

dcast.data.table中的动态/私有函数名称

我有一个关于data.table::dcast调用函数名称的范围的问题(data.table版本1.9.6,R 3.2.2).

我想制作函数名称,但这失败了.

这是我尝试过的:

library(data.table)
DT <- data.table(value = c(1:10),
                 cat1 = c("a", "b", "a", "b", "a", "b", "a", "b", "c", "a"),
                 cat2 = c("x", "x", "x", "y", "y", "y", "y", "y", "y", "x"))
Run Code Online (Sandbox Code Playgroud)

这很好用:

result1 <- dcast.data.table(DT, cat1 ~ cat2, value.var = "value", fun = sum)
Run Code Online (Sandbox Code Playgroud)

现在我创建自己的函数,它也有效:

f1 <- function(x) {
    y <- sum(x) ^ 2
    return(y)
}
result2 <- dcast.data.table(DT, cat1 ~ cat2, value.var = "value", fun = f1)
Run Code Online (Sandbox Code Playgroud)

在这里我做同样的事情,但我在一个函数中创建一个私有函数.然而,这失败了Error in eval(expr, envir, …

r data.table

9
推荐指数
1
解决办法
150
查看次数

在函数内找不到 lapply data.table 的对象

假设我有以下 R 代码:

library(data.table)
L <- list(a=data.table(x=c(1,2,3),y=c(10,20,30)),
          b=data.table(x=c(4,5,6),y=c(40,50,60)),
          c=data.table(x=c(7,8,9),y=c(70,80,90)))


columnName <- "x"         
r <- lapply(L,"[",i=get(columnName) %in% c(1,4))

f <- function(L1) {
     columnName1 <- "x"
     r1 <- lapply(L1,"[",i=get(columnName1) %in% c(1,4))
     return(r1)
}

r1 <- f(L)
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么在函数内部对底部 r1 的赋值失败

get(columnName1) 中的错误:找不到对象“columnName1”

对 r 的进一步分配工作正常。同样,如果在函数内部,我通过 <<- 将其更改为 columnName1 的全局赋值,但随后我创建了一个我并不真正想要的全局变量.... 我怎样才能干净利落地重写这样的数据。表在其范围内找到 columnName1?我在范围界定方面缺少什么?我原以为如果在“[”函数中找不到 columnName1,它会“向上”查找一个环境并在那里找到它?它必须查看全局环境,而不是父级?

r data.table

5
推荐指数
1
解决办法
2395
查看次数

标签 统计

data.table ×2

r ×2