Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.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 - Fatal编程技术网

R 将函数应用于数据库的每一列

R 将函数应用于数据库的每一列,r,R,我使用的是一个特殊的小生境函数,它要求将列的变量名作为对象名进行分析。我想在许多列上循环此函数,但我不知道如何将列名解析为对象名,以使函数正常工作 以下是一个例子: library(caper) library(ape) tree = rtree(100) data = data.frame(taxa = tree$tip.label, value1 = sample(c(0,1), 100, replace = TRUE),

我使用的是一个特殊的小生境函数,它要求将列的变量名作为对象名进行分析。我想在许多列上循环此函数,但我不知道如何将列名解析为对象名,以使函数正常工作

以下是一个例子:

library(caper)
library(ape)

tree = rtree(100)
data = data.frame(taxa = tree$tip.label, 
                  value1 = sample(c(0,1), 100, replace = TRUE),
                  value2 = sample(c(0,1), 100, replace = TRUE))

for(i in 2:3){
  phylo.d(data = data, phy = tree, 
          names.col = taxa,
          binvar = eval(substitute(colnames(data)[i]))
          )  
}
我遇到的问题是binvar参数。我目前在那里的代码不起作用,但这是我最好的猜测。这将返回以下错误:

phylo.d(data=data,phy=tree,names.col=taxa,binvar=eval(替换)(colnames(data)[i]))中的错误:'eval(替换(colnames(data)[i])不是数据中的变量。

从上面的参数
names.col
可以看出函数希望如何输入列名(如对象名)。然后,该函数使用
deparse(substitute(binvar))
从数据帧中提取列


有人能提出解决办法吗?(除了重新编写函数)

我的方法是在传递到
evaluate
之前为整个函数调用构建一个字符串。在这种情况下,循环的迭代将产生:

str="phylo.d(data=data,phy=tree,names.col=taxa,binvar=value1)"
str="phylo.d(data=data,phy=tree,names.col=taxa,binvar=value2)"
然后使用
print(eval(str2expression(str)))
对每个参数进行求值。我使用print是因为
phylo.d
似乎会产生不可见的输出

如果要保存对
phylo.d
的调用输出,则在上面的字符串中构建赋值,并删除
print
语句

如果您对
rlang
包和准旋转感到满意,您可能可以构建一个更整洁的解决方案

以下是我的整个解决方案:

build.expr=function(i) {
   paste("phylo.d(data=data,phy=tree,names.col=taxa,binvar=",
     colnames(data) [i],")",sep='')
}

for (i in 2:3) {
    print( eval(str2expression(build.expr(i))))
}
仅供参考:这是我的会议信息,因为你问了

> sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 19.10

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/openblas/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/libopenblasp-r0.3.7.so

locale:
 [1] LC_CTYPE=C.UTF-8       LC_NUMERIC=C           LC_TIME=C.UTF-8       
 [4] LC_COLLATE=C.UTF-8     LC_MONETARY=C.UTF-8    LC_MESSAGES=C.UTF-8   
 [7] LC_PAPER=C.UTF-8       LC_NAME=C              LC_ADDRESS=C          
 [10] LC_TELEPHONE=C         LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C   

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] compiler_3.6.1 tools_3.6.1   

当我键入?str2表达式时,它会显示一个基本R的包。

这就是为什么不使用非标准求值规则编写函数的原因。我指的是<代码> PyLo.D./Cord>的作者,而不是你。如果我的解决方案是可用的,你会考虑把它作为解决方案吗?道歉,因为我的回答是在度假。这似乎是一个很好的选择,但不幸的是我找不到你的答案,因为我找不到你提到的str2表达式函数。这是从什么包来的?将最后一行代码更改为打印(eval(parse(text=build.expr(i)))对我来说很有趣-它似乎在我的基本R中,但既然你让它工作起来了…我正在运行R3.5.3,这是我在我们的会话之间看到的唯一明显区别。那么我猜就是这样了耸耸肩:虽然在Mac上也是如此(但如果我认为这就是区别的话,那就太奇怪了)