当前位置: 首页 > 知识库问答 >
问题:

怪异的dplyr NSE:在mutate内部的自定义函数中使用NSE

牛越
2023-03-14

在<code>dplyr::mutate</code>中的自定义函数中使用NSE时,我遇到了一个问题。考虑以下代码:

require(tidyverse)

f <- function(var) {
  varname <- deparse(substitute(var))
  v1      <- as.name(sprintf("%s.Width", varname))
  v2      <- as.name(sprintf("%s.Length", varname))
  return(substitute(v1 + v2))
}

iris %>% 
  mutate(
    test = f(Sepal) %>% eval()
  )

ff <- function(var) {
  varname <- deparse(substitute(var))
  v1      <- as.name(sprintf("%s.Width", varname))
  v2      <- as.name(sprintf("%s.Length", varname))
  substitute(v1 + v2) %>% eval.parent(n = 1)
}

iris %>% 
  mutate(
    test = ff(Sepal)
  )

这里f工作正常,但需要外部调用val()以在mutate()环境中执行代码。这当然有点难看,并导致了很多样板代码。我对制作这项工作的最佳猜测是ff,它试图在其调用环境中评估构造的表达式-我预计这是mutate()环境。但是,这会引发一个未找到变量的错误。关于如何使其工作以及潜在问题是什么的任何想法?本质上,我希望允许在dplyr动词中自定义“宏”。

共有1个答案

蓟捷
2023-03-14

使用 !! 整洁的 eval “unquote” 运算符

ff <- function(var) {
  varname <- deparse(substitute(var))
  v1      <- as.name(sprintf("%s.Width", varname))
  v2      <- as.name(sprintf("%s.Length", varname))
  substitute(v1 + v2)
}

iris %>% 
  head() %>% 
  mutate(
    test = !! ff(Sepal)
  )
 类似资料:
  • 当在Spring中实现全局异常处理程序时,我注意到,如果不能识别接受头,Spring会抛出它自己的内部错误。我需要的是返回一个自定义的JSON错误结构。适用于特定于应用程序的异常,完全失败。 此代码告诉我"未能调用@ExceptionHandler方法:publicjava.util.Map RestExceptionHandler.springMalformedAcceptHeaderExcti

  • 我在一个函数中有这样的代码块: 它获取一些数据,然后对数据运行验证()。 但是,我对数据的验证实际上也是异步的,因为它是根据一个json模式来验证数据的,而json模式位于一个独立的json文件中,所以它必须首先读取该文件。 我使用了一个承诺来读取文件内容,然后进行验证: 如何编辑此问题中的顶部代码块以解释if语句()中的异步函数?

  • 我目前正在学习SwiftUI,想开发自己的应用程序。我设计了一个和一个,它们应该处理登录背后的所有逻辑。当用户输入错误的用户名/密码时,屏幕上应该会出现一个警报。我用状态变量解决了这个问题。但现在出现了棘手的部分,因为我想将这个变量的绑定传递给中的登录函数。看一下下面的代码: 我现在正在尝试更改登录函数中的错误值: 但我发现了错误 无法赋值:“error”是“let”常量 我认为这是有意义的,因为

  • 问题内容: 我正在尝试在Go中的另一个函数中定义一个递归函数,但是我在努力获取正确的语法。我正在寻找这样的东西: 我想将Function2保留在Function1的范围内,因为它正在访问其范围的某些元素。 如何在Go中执行此操作? 非常感谢 问题答案: 如果它在声明它的行中,则无法访问它的内部。原因是您不是在指 函数, 而是指 变量 (类型是函数),并且只有在声明后才能访问它。 引用规格:声明和范

  • 主要内容:操作整个数据表,操作行或列,操作单一元素如果想要应用自定义的函数,或者把其他库中的函数应用到 Pandas 对象中,有以下三种方法: 1) 操作整个 DataFrame 的函数:pipe() 2) 操作行或者列的函数:apply() 3) 操作单一元素的函数:applymap() 如何从上述函数中选择适合的函数,这取决于函数的操作对象。下面介绍了三种方法的使用。 操作整个数据表 通过给 pipe() 函数传递一个自定义函数和适当数量的参

  • 问题内容: 考虑一下Swift中的此类: 僵尸继承了Monster类的名称字段。 为什么 即使在函数头之前没有mutation关键字也能工作吗? 问题答案: 从语言指南- 方法中 : 从实例方法中修改值类型 结构和枚举是 值 类型。默认情况下,不能从其实例方法中修改值类型的属性。 但是,如果需要在特定方法中修改结构或枚举的属性,则可以选择对该方法进行行为更改。然后,该方法可以从方法内部更改(即更改