我正在尝试使用-package中的curve3d函数emdbook来创建在另一个函数内部本地定义的函数的等高线图,如以下最小示例所示:
library(emdbook)
testcurve3d <- function(a) {
fn <- function(x,y) {
x*y*a
}
curve3d(fn(x,y))
}
Run Code Online (Sandbox Code Playgroud)
出乎意料的是,这会产生错误
> testcurve3d(2)
Error in fn(x, y) : could not find function "fn"
Run Code Online (Sandbox Code Playgroud)
而相同的想法与-package 的更基本curve功能一起正常工作base:
testcurve <- function(a) {
fn <- function(x) {
x*a
}
curve(a*x)
}
testcurve(2)
Run Code Online (Sandbox Code Playgroud)
问题是如何curve3d重写它以使其表现如预期.
我正在开发一个用于进行概率多项选择测试的小型shinyapp,参见1997年的Bernardo.对于测试中的每个问题,将会有4个可能的答案.每个参与者都应该为每个备选方案分配som值,以反映每个备选方案是正确答案的信念程度.我正在使用该sliderInput功能录制此输入.由于四个概率必须总和为1,因此我重新调整当前问题的所有四个概率(存储为矩阵中的一行prob <- reactiveValues( ))以满足此约束.这是由observeEvent(input$p1, )等等触发
一旦这些概率发生变化,就会触发服务器功能内部四个sliderInput内部的更改,renderUI( )以便更新所有滑块.这又会触发对函数更新的进一步调用,prob但由于此时的概率已经总和为1,prob因此保持不变,因此不应对滑块进行进一步的更改.您可以通过运行shinyapps.io上托管的应用程序来亲眼看到.
这通常非常有效,除了在一些非常罕见的情况下,无限循环被设置为使得所有四个滑块始终保持变化.我相信如果用户在其他三个滑块有时间调整之前对其中一个滑块进行了第二次更改,则会发生这种情况.
所以我的问题是,如果有某种方法可以避免这种循环,或者是否有更好的方法来实现上述想法.我注意到还有一个updateSliderInput功能,但我真的没有看到这可能有助于解决问题.
更新:我认为在这个线程中提出的仅涉及两个滑块的类似问题的解决方案由于和之间的相互依赖性slider1而遭受同样的问题slider2.
library(shiny)
digits=3
step <- .1^digits
# Dummy questions and alternatives
n <- 5
# Miscellaneous functions
updateprob <- function(oldprobs, new, i) {
cat(oldprobs, new, i)
if (new==oldprobs[i]) {
cat("-\n")
oldprobs
} else {
newprobs <- rep(0,4)
oldprobs <- oldprobs + 1e-6 # …Run Code Online (Sandbox Code Playgroud)