函数与apply一起工作,但不变异R以寻求更深入的理解

函数与apply一起工作,但不变异R以寻求更深入的理解,r,dplyr,R,Dplyr,似乎变异和应用的工作方式不同,我想了解一些情况。首先,我将从一个示例开始: df = data.frame(base = as.character(letters), dat1 = runif(26), dat2 = runif(26)) df = df %>% mutate(path = paste0(base,'.txt')) test_function = function(path){ print(length(path)) if(exists(path)){

似乎变异和应用的工作方式不同,我想了解一些情况。首先,我将从一个示例开始:

df = data.frame(base = as.character(letters), dat1 = runif(26), dat2 = runif(26))
df = df %>% mutate(path = paste0(base,'.txt'))

test_function = function(path){
    print(length(path))
    if(exists(path)){
        table = read.table(path)
        return(mean(table[,1]))
    } else {
        return(NA)
    }
}

# This prints 26 ones
df$val = unlist(
    lapply(
        df$path,
        test_function
    )
)

# This prints 26
df = df %>% mutate(val = test_function(path))
两个函数产生相同的结果,但它们打印不同的值

我觉得在apply中,我们调用函数26次,每次都向函数传递一条路径

使用mutate时,我们似乎只调用了一次函数。将路径向量传递给它

我的问题归结到这一点。当我写我真正的函数时。我需要担心这些差异吗?我刚刚从一个库中调用了一个函数,该库检查传递的参数的维度,它抛出了一个带有mutate的错误


如有任何见解,将不胜感激

我发现@yeedle和@thelatemail的评论足以回答我的问题。此外,请查看这篇描述矢量化代码原因的文章。(这是一本很棒的书)

总结他们的意见:

apply
不尝试对操作进行矢量化,而
dplyr
函数
mutate
需要矢量化函数。大多数函数都可以使用矢量化进行矢量化


在上面的示例中,对于向量化函数,
if else
代码对于
df$path
的第一个值只运行一次,但是使用
lappy
时,它只是将
if-else
循环到
df$path
中的每个值上,这样就可以得到26个不同的结果,而不是一个。

我读了一些关于矢量化代码的内容。这是一个例子吗?mutate需要向量化函数。您可以使用
vectorize
对大多数标量函数进行矢量化,如果
如果
否则
对于
df$path的第一个值,代码将只运行一次-如果您尝试类似
x Good stuff的操作,请参阅警告消息。因此,我认为最好将答案放在答案中,而不是仅仅指向评论。如果你喜欢,一个简短的评论和/或链接摘要将是一个很好的回馈社区的礼物。