【问题标题】:Evaluating a function pointed to by a string in R - Follow-Up评估 R 中字符串指向的函数 - 后续
【发布时间】:2021-05-22 21:23:27
【问题描述】:

这是我之前提出的问题 (Evaluating a function pointed to by a string in R) 的后续问题,旨在使问题和解决方案更加通用。假设我有以下内容:

   x <- 1:3  
   y <- 2
   foo <- function(x, y) {x^y}  
   a <- "foo"  
   b <- "x"  
   c <- "y"

我希望能够使用由 a、b 和 c 定义的字符串来评估函数 foo。 match.fun(a)(b, c) 之类的东西,我知道这是错误的,但会返回

[1] 1 4 9

或者为了让问题更笼统,假设

   x <- 1:3  
   y <- 2
   foo <- function(x, y) {x^y}  
   a <- "foo"  
   b <- "x, y"

match.fun 如何提供相同的解决方案?

感谢任何帮助。

【问题讨论】:

  • R 是一种适当的函数式语言,它允许元编程来操作代码。与其他更像宏的编程语言(如 SAS)不同,语言符号与字符串完全不同。您需要在可解析的块中使用 R 代码。尽可能避免将任意代码放入字符串中。但如果无法避免,您可以使用内置的parse() 函数,这基本上就是将控制台输入的任何字符串转换为可执行代码的方式。

标签: r string function


【解决方案1】:

问题在于“b”、“c”是存储另一个变量“x”、“y”的变量。我们需要get 这些变量的值。为此可以使用get,它将以递归方式查找值

match.fun(a)(get(b), get(c))
#[1] 1 4 9

【讨论】:

  • 假设 b 是 b
  • 我回答了发布的问题
  • 我试图使案例尽可能笼统。您提供的解决方案回答了直接提出的问题。 match.fun 的在线帮助没有讨论任何这些,我试图尽可能地扩展和概括该解决方案。
  • @PeterBonate 您能否用您遇到的所有可能的情况更新您的帖子。它们中的每一个都被单独评估。如果这些是存储单个变量的变量,则将其存储在内存堆栈中。因此,当我们使用get 时,它会将数据存储在该内存堆栈中。但是,假设如果有多个变量,用,分隔,每个单独存储,我们可能需要用strsplit分割那个字符串,然后使用mgetget
猜你喜欢
  • 2021-05-21
  • 2018-10-03
  • 2020-11-01
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 2022-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多