问题标签 [non-standard-evaluation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
r - 如何在函数中将“一切可能”传递给 by?
我正在尝试data.table
在我正在处理的包中的面向用户的功能中使用。我希望这个函数尽可能地表现得像data.table
- 一样。例如,这意味着我的函数还具有一个by
参数,该参数被传递给函数内的底层data.table
调用。用户应该可以自由地将任何东西传递给“我的” by
,这可以直接在data.table
.
引用?data.table
包括:
- 单个不带引号的列名:例如,DT[, .(sa=sum(a)), by=x]
- 列名表达式的 list():例如,DT[, .(sa=sum(a)), by=.(x=x>0, y)]
- 包含逗号分隔的列名的单个字符串(其中空格很重要,因为列名甚至在开头或结尾也可能包含空格):例如,DT[, sum(a), by="x,y,z"]
- 列名的字符向量:例如,DT[, sum(a), by=c("x", "y")]
- 或 startcol:endcol 的形式:例如,DT[, sum(a), by=x:z]
这是一个最小的(部分)工作示例,可以使我的意图明确:
由reprex 包(v0.3.0)于 2020-02-18 创建
除了案例 4,在适当的上下文中使用简单的替换和评估,一切都按预期工作。所以我的问题是:
如何创建data.table
在内部使用并完全模仿原始by
用户界面的函数?
会话信息
r - 如何在嵌套函数中将所有可能的内容传递给 i、j 和 by?
我正在研究一个data.table
在内部使用的包。在这个包中,我有一个函数,它计算 a by 组count_by
中特定变量的不同 ID 的数量。data.table
在一些帮助下(R data.table: How to pass "everything possible" to by in a function?)我得到了这个按预期工作:
由reprex 包于 2020-02-20 创建(v0.3.0)
现在我想count_by()
在另一个函数中使用该函数(下面的最小示例):
由reprex 包于 2020-02-20 创建(v0.3.0)
调试count_by()
导致观察到,如果count_by()
从 调用wrapper()
,substitute(DT[...])
也可以替换DT
为data
:
由于data
在它的功能环境中不可用,count_by()
因此会对其进行评估,utils::data
从而导致错误。这使问题变得清晰,但我想不出解决方案。
我需要替换整个DT[...]
表达式才能by
正常工作(请参阅R data.table: How to pass "everything possible" to by in a function?或将变量和名称传递给 data.table 函数)。但是我不能为了不被替换而替换整个表达式DT
。
解决这个困境的方法是什么?
r - 如何用`with`函数调用`eval`?
拥有一个lm
对象,我需要根据其表示为字符向量的变量创建一个函数。我尝试使用eval
和的组合expr
来创建一个f
函数,该函数将进一步用于后者obj
并对其进行nlm
优化。
但是调用f(model$x, df$Temp, model$y, c(0, 0, 0, 0, 0, 0, 0))
会导致以下错误:
eval
我相信环境与函数所暗示的环境之间可能存在冲突with
,但无法弄清楚原因。任何想法如何f
为变量模型创建自定义函数?
的预期输出为f(model$x, df$Temp, model$y, c(0, 0, 0, 0, 0, 0, 0))
:
但对于不同的模型,它可能是这样的:
所以每次调用的变量和参数的数量都是不同的。
r - 使用非标准评估在 R 中动态更改列表名称
我尝试做的是在 R 中动态设置列表元素的名称,从预定义的字符串并使用非标准评估。
请参见下面的示例:
我将上面的代码基于一个 tidyverse 示例,该网站上最后一段名为“设置变量名称”:https ://dplyr.tidyverse.org/articles/programming.html
因此,应该首先将“dynamic.listname”作为存储在该变量中的字符串进行评估。然后,这个字符串应该被实现为列表中的名称之一。任何人都知道如何在这种情况下实施非标准评估?Base R 也适合我。我想要目前尚未使用的其他选项的原因是我要使用的列表嵌入在特定的包函数中,因此从外部操作有点困难。此外,我正在尝试了解更多关于非标准评估的信息。
r - 如何使用管道 (%) 将变量名称传递给函数中的 st_sample() 参数?
我想创建一个函数,该函数采用简单的要素图层和变量名称,并根据变量值创建随机点。我可以使用管道(%)按顺序执行此操作而不会出现问题,但我一直坚持使用管道设置功能来做同样的事情。
我怀疑我对如何处理函数参数中的非标准评估感到困惑。
r - 在函数内调用 lm() 中的权重无法正确评估
我正在编写一个需要加权回归的函数。我一直在使用 weights 参数时遇到错误,我创建了一个最小的可重现示例,您可以在此处找到:
这返回
eval 中的错误(extras、data、env):找不到对象“wts”
如果你单独运行这一切,它工作正常。我已经深入研究了 lm,看来问题是对eval(mf, parent.frame())
. 即使 wts 在 parent.frame() 中,它似乎也没有在调用中正确评估。这里有更多细节:
分配 mf 使其与
当我跑
它确实返回一个数字向量。但是当我跑步时
它没有。
我可以跑
它有效。如果您想使用顶部的示例,您可以自己测试。
有什么想法吗?我真的不知道这里发生了什么......
r - 在 R 中,如何修改给定字符串名称的列表中的数据框列
我是 R 新手。感谢您的耐心等待。我正在使用调查包。
背景:我正在编写一个函数,该函数通过复杂调查中的预测变量和结果变量(即svyglm(outcome~predictor)
)的组合循环输出粗略的患病率。对于每个结果/预测变量组合,我想首先重新调整调查设计对象中的预测变量,以确保输出比率均 > 1。
具体问题:给定调查设计对象名称、列名和参考级别作为字符串,我如何告诉 RI 想要重新调整所述列的级别。
prams16 是调查设计对象的名称,其中包括 9 个项目的列表,变量是调查设计对象内的分析数据集(数据框),mrace 是变量 DF 中的一列。
这些工作:
但是,当我尝试构造对字符串prams16$variables$mrace
或prams16[["variables"]]["mrace"]
使用字符串的引用时,似乎没有任何效果。
谢谢!
编辑:请求可重现的问题示例。
julia - 朱莉娅有延迟设置吗?(相当于 := 来自 Mathematica)
我想在程序的不同部分多次调用类似rand((0, 1), N)
(之前分配了一些整数)的东西(我将来可能会将所有出现的情况更改为,例如,或)。如何创建一个变量,每当它被引用时,它都会评估这个函数?N
rand((-1, 1), N)
randn(N)
我不想只写这样rand_thing = rand((0, 1), N);
的东西,因为那时随机值每次都相同,这是不希望的。
当然,我可以在我想写的时候定义rand_func = rand((0, 1), N);
和调用. 我也可以做一些涉及到的事情,然后在我想写的时候打电话。但是,有没有办法我可以获得这个功能并且只写来生成我的随机数?rand_func()
rand((0, 1), N)
eval
rand_ex = :(rand((0, 1), N));
eval(rand_ex)
rand((0, 1), N)
rand_thing
这是一个具体的例子,它是一个更大的问题的一部分,即是否有东西可以直接完成Mathematica中SetDelayed
( ) 的功能。:=
如果我这样做rand_thing := RandomReal[];
而不是thing = RandomReal[];
在 Mathematica 中,那么每次我写rand_thing
我都会得到一个新的随机数。(在 Mathematica 中,我不会使用下划线作为变量名,但无论如何。)
如果我所描述的内容是不可能的,那么对于为什么SetDelayed
在 Mathematica 中可能但在 Julia 中没有类似的东西的一些见解将不胜感激。这是语言的根本区别吗?或者这是不同约定的问题?或者,也许 Julia 可以很容易地拥有一个延迟集合运算符,但到目前为止它还不是语言语法的一部分?(如果是这样,实现会是什么样子?)或者别的什么?
r - 在使用非标准评估的函数中,检查列是否存在
我正在尝试将非标准评估与一个函数一起使用,如果提供的 data.frame 中存在一列,则会发生一组事情,如果存在不同的列,则会发生其他事情。但是,当用户在函数中提供列名时,我不知道如何检查该条件。这是一个例子:
如果用户可能提供的所有 data.frames 中都存在 columnB,则此函数将起作用:
如果 columnC 一直存在,那么这个函数就可以工作:
但我真正想要的是一个更灵活的函数,它将检查 columnB 是否是提供的 data.frame 中的列,如果是,则执行某些操作,如果不是,则执行其他操作。像这样的东西,除了我知道这个if
陈述是不正确的:
我试过了if(quote(columnB) %in% names(DF))
,我试过if(deparse(columnB) %in% names(DF))
了,但那些都没用。
如果
并且
两者都有效。
r - (R, purrr) 按名称对列对进行迭代,一个常量和一个来自列表
我正在尝试生成一个图形对象列表(grobs),适合传递给 gridExtra::grid.arrange (或者如果更容易的话,可以使用一些 ggequivalent )。我重新起草了我的示例,以消除@MrFlick 和@Ronak Shah 友好指出的多个问题。但是,我仍然收到相同的错误消息:
(而且我没有得到一个谷歌点击“ unused argument (NULL)
” r
| purrr
。我找到的最接近的是unused argument (.null = NA)
。)
acf
每个对象是一组四个图(绘制在一起),作为or函数的副作用输出pacf
,显示两个变量之间的自相关和自协方差及其各种滞后。我正在尝试编写一个函数,该函数将采用 tsibble、来自该 tsibble 的自变量列名的向量以及单个结果变量的名称(也是输入 tsibble 中的列),并使用 purrr取acf
或pacf
由单个名称与每个指定列定义的变量对,将绘图转换为 grob,并输出 grobs 列表。
这是我的非工作功能,acf 版本:
还有一个可重现的例子:
我知道这加载的包比本示例所需的要多得多,但我加载所有这些包是出于其他原因。
我仍然相信错误消息是由于我未能正确地将单个参数传递outcome
给 purrr::map 的函数参数引起的,尽管这种信念动摇了,因为我现在以不同的方式传递它,并且仍然得到相同的错误消息。