- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在处理 SQL 和用户输入。因此,我使用 glue
库来处理参数化查询。
但是,为了保持简洁,我将所有内容包装在一个函数中:
safeQuery <- function(con, sql, ...) {
sql = glue_sql(sql, ..., .con=con)
query <- dbSendQuery(con, sql)
out <- dbFetch(query)
dbClearResult(query)
return(out)
}
因此,我只需使用连接、SQL 代码以及 glue_sql
适当绑定(bind)的该 SQL 代码的参数列表来调用该函数。
这工作得很好。
现在,我有一个特定的 SQL 调用,我经常以这样或那样的方式使用它,但参数各不相同。
所以我决定为此创建一个函数:
get_data <- function(con, params) {
safeQuery(con,
"SELECT *
FROM foo
WHERE bar IN ({vars*})",
vars=params)
}
p = c(1, 2)
get_data(con, p)
因此,用户数据(在本例中为 c(1, 2)
)将被传递到 get_data
,后者会将其与 SQL 调用一起传递给 safeQuery
,其中 glue_sql
将负责绑定(bind)。
但是,如果我实际尝试运行 get_data
,则会收到错误
object 'params' not found
谷歌搜索和 SO'ing 已经清楚地表明这与 R 的惰性求值有关。
事实上,将 get_data
更改为
get_data <- function(con, params) {
do.call("safeQuery",
list(con,
"SELECT *
FROM foo
WHERE bar IN ({vars*})",
vars=params)
}
(按照 this answer 的建议)工作得很好,因为 do.call
在将列表中的参数发送到 safeQuery
之前先评估它们。
我不明白的是为什么这是必要的。毕竟,params
的值在传送到 glue_sql
的过程中的任何步骤都不会被修改,因此它应该仍然可用。
链接的答案讨论了使用substitute
(我还阅读了关于该主题的this R-bloggers post)将参数的名称替换为调用者的名称(或者如果参数值则替换为它的实际值)是直接给出的),但这对我来说不起作用。修改 get_data
以使用 substitute
:
get_data <- function(con, params) {
do.call("safeQuery",
list(con,
"SELECT *
FROM foo
WHERE bar IN ({vars*})",
vars=substitute(params))
}
从 glue_sql
生成以下 SQL:
SELECT *
FROM foo
WHERE bar IN (params)
而不是params
的实际值。我无法在 safeQuery
中尝试相同的操作,因为参数隐藏在 ...
中,并且 substitute(...)
不起作用。我试过了。
我还尝试在 get_data
开始时调用 force(params)
,但这给出了相同的未找到对象
错误。
get_data <- function(con, params) {
force(params)
do.call("safeQuery",
list(con,
"SELECT *
FROM foo
WHERE bar IN ({vars*})",
vars=params)
}
那么,为什么标准调用时 params
会“丢失”呢?为什么do.call
可以工作,但force(params)
不行?是否可以使用标准评估来完成这项工作?
我不会撒谎:这段经历让我对如何编写函数和处理它们的参数感到困惑(我考虑从现在开始只使用 do.call
)。如果可以在不过度扩展这个问题范围的情况下给出提示,我将非常感激。
最佳答案
我不太清楚为什么会这样,但确实如此。
safeQuery <- function(con, sql, ...) {
dots = list(...)
dots
}
然后当你调用get_data("foo_con", params = 1:3)
时,你会得到:
$`vars`
[1] 1 2 3
现在我们在命名列表中有参数,这意味着您应该使用 glue_data
(或 glue_data_sql
):
safeQuery <- function(con, sql, ...) {
dots = list(...)
glue_data_sql(.x = dots, sql, .con=con)
# More code...
}
现在,当您调用 get_data("foo_con", params = 1:3)
时,您会得到:
<小时/><SQL> SELECT *
FROM foo
WHERE bar IN (1, 2, 3)
问题在于参数在哪个环境中求值。强制执行此操作的一种方法是传递您想要的环境:
safeQuery <- function(con, sql, ..., .envir = parent.frame()) {
dots = list(...)
glue_sql(sql, ..., .con=con, .envir = .envir)
# More code...
}
get_data <- function(con, params) {
env <- environment()
safeQuery(con,
"SELECT *
FROM foo
WHERE bar IN ({vars*})",
vars=params, .envir = env)
}
get_data("foo_con", params = 1:3)
<SQL> SELECT *
FROM foo
WHERE bar IN (1, 2, 3)
关于r - 为什么惰性求值 "lose"是函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57299608/
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 7 年前。 Improve t
我正在处理 SQL 和用户输入。因此,我使用 glue 库来处理参数化查询。 但是,为了保持简洁,我将所有内容包装在一个函数中: safeQuery SELECT * FROM foo WHERE
我的拓扑是这样的:kafka(p:6)->reduce(p:6)->db writer(p:12)(其中p:是并行)。 我让它在单个节点“集群”上运行 taskmanager.numberOfTask
我有一个 Singleton 类,我试图用它来存储从 Internet 下载的图像,以便我可以随时访问它。工作流程是我登录到 Facebook,并将图像下载到 Singleton 类。一切都很好,它显
首先,这是我的声明和初始化: int** GameField = 0; GameField = new int*[mapsize]; for(int i = 0; i
我正在使用 pthreads 编写一个多线程演示程序,其中一个线程将数据加载到 STL 队列中,另一个线程从中读取数据。听起来微不足道,对吧?不幸的是,插入队列的数据正在消失。我对多线程并不陌生,也不
我有一个函数 (GetArgs) 使用可变参数模板对它的参数(每个指针)进行排序,将每个参数发送到另一个函数 (GetArg),该函数已为每种类型重载(目前是整数和 float )。每种类型的重载函数
我成功地使用蓝牙连接了 iPhone 和 Mac。 iPhone 是核心,Mac 是外围设备。连接后,两者都可以通信(iPhone 正在订阅一些特征,由 Mac 宣传)。 但是,经过一段时间(随机?)
这是一个足够简单的问题,令我感到惊讶的是,我找不到任何对之前问过它的人的引用。和this不一样,也不受 this discussion 的保护. 我有一个 4-d 矩阵(尺寸为 16x10x15x39
我正在使用两个组件,并且我正在使用这种模式:子组件应尽可能保持隔离 - 它正在处理自己的验证错误。父组件应该检查子组件之间存在依赖关系的错误。因此,就我而言:密码字段和密码确认字段。 这是我的代码
我有一个应用程序,用户可以通过两种方式浏览 map (例如缩略图和列表中的 map ) /map/browse /map/list 现在,我想将这些 View 限制为仅显示特定用户的 map ,例如通
我有这种类型和这些功能: data Tag a where Tag :: (Show a, Eq a, Ord a, Storable a, Binary a) => a -> BL.Byte
我写了一个非常简单的 Flink 流作业,它使用 FlinkKafkaConsumer082 从 Kafka 获取数据。 protected DataStream getKafkaStream(Str
几天前我不小心删除了我的.bashrc。我尝试重新创建它,但不幸的是我仍然遇到一些问题。我以前使用的 Java 调试器不再正常工作,因为它找不到这个类: aetherboard:Home shwang
我正在尝试序列化/反序列化以下内容 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME) @JsonSubTypes({ @JsonSubTypes.Type(v
我目前正在编写一个非常小的Java程序来实现一次性pad,其中pad(或 key )本身是使用SecureRandom对象生成为一系列字节的,该对象使用一个简单的字符串进行播种SHA-512 算法。
您可以通过在物理设备上下载并运行此代码来重现错误:https://github.com/Hoya/RCCPeakableImageView 它所做的是通过 UIImageView 子类向图像添加视差效
我在使用 google analytis 时遇到了一些问题。我们有一个网站,用户可以在登陆页面上填写个人信息(姓名、地址、电子邮件等)。该网站位于http://link.提交表单后,用户将被定向到 h
我正在创建一个可以使用键盘控件旋转的 3D 立方体。但是在旋转之后,每张脸的部分失去了交互性(鼠标事件不会在包含的元素上注册)。任何人都知道可能导致该问题的原因是什么? 这很难解释,所以这里有一个测试
我今天在调试 SWIG 类型映射时遇到了一个有趣的问题。任何人都想告诉我为什么 Visual C++ 2008 在从 ourLib::Char * 转换为 const ourLib::Char * &
我是一名优秀的程序员,十分优秀!