将函数形式从代码作为字符串应用/映射到新函数体中

2023-12-09

我想获取用户的代码并进行转换reactive()调用这样的函数。

a <- reactive({
  input$n * 100
})

并将其转换为

a <- function() {
  input$n *100
}

这是我的一部分闪亮的物体包裹。我已经整理了一个解决方案,但我不知道这是否是正确的方法。任何帮助/反馈/资源将不胜感激。我不知道是否rlang or lobstr可能有帮助。

code <- 
  "library(shiny)

  input <- list(cty = 15)
  
  df <- reactive({
    x <- input$cty
    mpg %>% filter(cty < x)
  })
  
  n_obs <- reactive(head(df()))"



all_expr <- parse(text = code)

reactive_to_function <- function(x) {
  if (grepl("reactive\\(", as.character(x))) {
    code_as_call <- as.call(x)[[1]] 
    get_symbol <- code_as_call[[2]] 
    get_formals <- code_as_call[[3]][[2]]
    new_exp <-
      as.expression(
        bquote(
          .(get_symbol) <- function() .(get_formals)
        )
      )
    
    final_code <- new_exp
  } else {
    final_code <- x
  }
  
  final_code
}

单独工作

reactive_to_function(all_expr[3])
#> expression(df <- function() {
#>     x <- input$cty
#>     mpg %>% filter(cty < x)
#> })

reactive_to_function(all_expr[4])
#> expression(n_obs <- function() nrow(df()))

并有一个循环

exp_list <- expression()

for (i in seq_along(all_expr)) {
  exp_list <- 
    append(
      exp_list, 
      as.list(convert_assignments(all_expr[i])),
      after = i - 1
    )
}

exp_list

但无法让 apply/map 功能正常工作

lapply(all_expr, reactive_to_function)
#> Warning in if (grepl("reactive\\(", as.character(x))) {: the condition has
#> length > 1 and only the first element will be used
#> [[1]]
#> library(shiny)
#> 
#> [[2]]
#> input <- list(cty = 15)
#> 
#> [[3]]
#> df <- reactive({
#>     x <- input$cty
#>     mpg %>% filter(cty < x)
#> })
#> 
#> [[4]]
#> n_obs <- reactive(nrow(df()))

这是受到启发的数据表的方式来替换它的.() alias.

code <- 
    "library(shiny)

  input <- list(cty = 15)
  
  df <- reactive({
    x <- input$cty
    mpg %>% filter(cty < x)
  })
  
  n_obs <- reactive(head(df()))"

all_expr <- parse(text = code)

f_recurse_look = function(e) {
    if (is.call(e)) {
        if (e[[1L]] == "reactive")
            e = as.function(as.list(e)[-1L])
        else
            for (i in seq_along(e)[-1L]) if (!is.null(e[[i]])) e[[i]] = f_recurse_look(e[[i]])    
    }
    e
}

lapply(all_expr, f_recurse_look)
#> [[1]]
#> library(shiny)
#> 
#> [[2]]
#> input <- list(cty = 15)
#> 
#> [[3]]
#> df <- function () 
#> {
#>     x <- input$cty
#>     mpg %>% filter(cty < x)
#> }
#> 
#> [[4]]
#> n_obs <- function () 
#> head(df())

这种方法将递归地查找表达式调用,直到找到reactive。请注意,这意味着如果reactive如果在单个表达式中进行多次调用,则需要修改此解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将函数形式从代码作为字符串应用/映射到新函数体中 的相关文章

  • 如何删除箱线图上的刻度线

    我试图从箱线图中删除 x 轴刻度线 但保留与刻度线关联的标签 这在基础 R 中可能吗 colors lt c lightskyblue3 gray78 gold1 wheat1 boxplot avgscore module data mi
  • 我无法下载 R 中的 reshape2 包 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试安装 R 包时收到此响应 gt installed packages reshape2 Package LibPath V
  • 在 R 中向散点图添加线条

    如何向图表添加线条 我做了以下 dat lt data frame xvar 1 20 rnorm 20 sd 10 yvar 1 20 rnorm 20 sd 10 zvar 1 20 rnorm 20 sd 10 plot dat 1
  • R - Plm 和 lm - 固定效应

    我有一个平衡面板数据集 df 本质上由三个变量组成 A B and Y 对于一堆独特识别的区域来说 它会随着时间的推移而变化 我想运行一个回归 其中包括区域 下面等式中的区域 和时间 年份 固定效应 如果我没记错的话 我可以通过不同的方式来
  • 使用 pracma::findpeaks 识别持续峰值

    我的语法有问题peakpat内的选项findpeaks内的函数pramcaR 包 v 2 1 1 我使用的是 R 3 4 3 x64 Windows 我希望该函数能够识别可能有两个重复值的峰值 并且我相信该选项peakpat这就是我能做到的
  • 通过间接引用列来修改数据框中的某些值

    我正在整理一些数据 我们将失败的数据分类到垃圾箱中 并按批次计算每个分类箱的有限产量 我有一个描述排序箱的元表 这些行按升序测试顺序排列 一些排序标签带有非语法名称 sort tbl lt tibble tribble weight lab
  • R 中的快速 QR 分解

    我有大量矩阵 需要对其执行 QR 分解并存储生成的 Q 矩阵 进行归一化 以便 R 矩阵在其对角线上具有正数 除了使用之外还有其他方法吗qr 功能 这是工作示例 system time Parameters for the matrix t
  • 尝试读取 CSV 文件时出现“无法识别的字符串转义”

    我正在尝试导入一个 csv文件 以便我可以观看此视频 R ggplot2 图形直方图 http www youtube com watch v 47kWynt3b6M 我安装了所有正确的软件包 包括ggplot以及相关的包 视频中的第一个说
  • pyomo + 网状错误 6 句柄无效

    我正在尝试运行pyomo优化 我收到错误消息 Error 6 The handle is invalid 不知道如何解释它 环顾四周似乎与特权有关 但我不太明白 在下面找到完整的错误跟踪以及重现它的玩具示例 完整的错误跟踪 py run f
  • 从命令行运行 R 代码 (Windows)

    我在名为 analysis r 的文件中有一些 R 代码 我希望能够从命令行 CMD 运行该文件中的代码 而无需通过 R 终端 并且我还希望能够传递参数并在我的代码中使用这些参数 例如就像下面的伪代码 C gt execute r scri
  • 以引用透明的方式从函数的省略号参数中提取符号

    事情又发生了 我正要按下发布答案按钮的问题被删除了 我正在寻找一种方法来从函数的省略号参数中提取绑定到符号的对象的值以及符号 也就是说 我试图以引用透明的方式从省略号中提取符号 我尝试过使用替代品和lazy dots 但没有成功 funct
  • 如何仅删除单括号并保留配对的括号

    你好 我亲爱的老师 R 用户朋友们 我最近开始认真学习正则表达式 最近我遇到了一种情况 我们只想保留配对括号 并省略未配对的 这是我的样本数据 structure list t1 c Book Pg 1 Website Online Jou
  • 在 Rcpp 中使用其他包中的 C 函数

    我试图从 C 函数中的 cubature 包调用 C 例程来执行多维积分 我试图重现的基本 R 示例是 library cubature integrand lt function x sin x adaptIntegrate integr
  • 如何在 R 或 Python 中制作旭日图?

    到目前为止 我一直无法找到一个可以创建旭日图的 R 库约翰 斯塔斯科 http www cc gatech edu gvu ii sunburst 有人知道如何在 R 或 Python 中实现这一点吗 在极坐标投影中使用 matplotli
  • 如何使用 SparkR 1.6.0 写入 JDBC 源?

    使用 SparkR 1 6 0 我可以使用以下代码从 JDBC 源读取数据 jdbc url lt jdbc mysql localhost 3306 dashboard user
  • 使用 template.docx 从 Shiny App 编织 Word 文档

    我正在尝试使用 template docx 文件从闪亮的应用程序编写一个 Word 文档 我收到以下错误消息 pandoc exe template docx openBinaryFile 不存在 没有这样的文件或目录 以下 3 个文件当前
  • 任意列中包含字符串的子集行

    我有一个如下所示的数据集 Col1 Col2 Col3 abckel NA 7 jdmelw njabc NA 8 jdken jdne 如何对数据集进行子集化 使其仅保留包含字符串 abc 的行 最终预期输出 Col1 Col2 Col3
  • Shiny:动态数据框构建; renderUI、观察、reactiveValues

    我认为如何使用 Shiny 的 renderUI 功能动态子集数据的问题经常出现 但我很难理解何时使用 renderUI 带有 uiOutput 而不是其他功能 包括观察 反应 反应值甚至条件面板 我想构建一个完全交互式的数据框架 其中每个
  • 如何修复 R 中 Kaplan Meier 图的风险表计算错误

    以下是一个数据帧 其中 6 个参与者中的每一个都有唯一的 record ID 我想绘制一个生存分析图 其中包含感兴趣事件的复发以及在时间间隔 tstart 到 tstop 内 暴露 药物剂量 数值变量 的时间依赖性协变量 每个参与者的最大
  • 如何将plot中的单变量列表图表转换为ggplot2格式?

    我正在搜索 但仍然找不到一个非常简单的问题的答案 我们如何使用 R 中的 ggplot2 生成一个变量的简单线图 我正在分析时间序列数据 并且想要对图表进行更复杂的操作 我认为如果我使用 ggplot2 代替会更好plot It works

随机推荐