使用“";问题;R函数中的包

使用“";问题;R函数中的包,r,probability,R,Probability,我正在尝试编写一个函数,它使用包来计算条件概率。在使用函数时,我继续遇到相同的错误,即无法找到函数中的对象 下面是一个可重复的例子,在这个例子中,我计算了一个没有函数的条件概率,然后尝试使用函数来产生相同的结果。我不确定错误是由于prob包的限制还是我自己的错误造成的 # Load prob package library(prob) # Set seed for reproducibility set.seed(30) # Sample data frame sampledata <

我正在尝试编写一个函数,它使用包来计算条件概率。在使用函数时,我继续遇到相同的错误,即无法找到函数中的对象

下面是一个可重复的例子,在这个例子中,我计算了一个没有函数的条件概率,然后尝试使用函数来产生相同的结果。我不确定错误是由于prob包的限制还是我自己的错误造成的

# Load prob package
library(prob)

# Set seed for reproducibility
set.seed(30)

# Sample data frame
sampledata <- data.frame(
  X <- sample(1:10),
  Y <- sample(c(-1, 0, 1), 10, replace=TRUE))

# Set probability space
S <- probspace(sampledata)

# Subset Y between -1 and 0
A <- subset(S, Y>=-1 & Y<=0)

# Subset X greater than 6
B <- subset(S, X>6)

# Compute conditional probability
P <- prob(A, given=B)
尝试编写函数以计算相同的概率:

> P
[1] 0.25
# Create function with data frame, variables, and conditional inputs
prob.function <- function(df, variable1, variable2, state1, state2, cond1){
  s <- probspace(df)
  a <- subset(s, variable1>=state1 & variable1<=state2)
  b <- subset(s, variable2>cond1)
  p <- prob(a, given=b)
  return(p)
}

# Demonstrate the function
test <- prob.function(sampledata, Y, X, -1, 0, 6)
你能提供的任何帮助都会很好


谢谢

这看起来像是
prob
中的一个bug

当我在vanillar中运行这个程序时,我得到了相同的错误。但是,当我在工作区中创建对象
b
时,错误会消失:

> print(b)
Error in print(b) : object 'b' not found
> test <- prob.function(sampledata, Y, X, -1, 0, 6)
Error in eval(expr, envir, enclos) : object 'b' not found
>
> b <- "dummy variable"
> print(b)
[1] "dummy variable"
> test <- prob.function(sampledata, Y, X, -1, 0, 6)
> test
[1] 0.25
>
它从
g
跳到
给定的
,可能是无意中?我会联系软件包维护人员,因为这可能是一个疏忽

我不认为这是包
prob
中的错误

首先,您应该创建
sampledata
as

sampledata <- data.frame(
  X = sample(1:10),
  Y = sample(c(-1, 0, 1), 10, replace=TRUE))
并将
variable1
variable2
作为字符串传递:

test <- prob.function(sampledata, "Y", "X", -1, 0, 6)

测试感谢您的快速回答!我会将此错误通知软件包作者。感谢您,Ricardo,确定问题所在。@G.JayKerns一点问题也没有。我认为在其他
prob
方法中可能存在类似的问题,可能值得研究。谢谢你的软件包Hey@Ferdinand,虽然我认为你关于不使用子集的建议是正确的,但我仍然认为
prob
有可疑之处,可能是一个bug。请注意关于基于我的工作环境的函数的不同响应的部分,其中与函数的唯一关系是共享对象名(但该值与函数没有连接)。更不用说,在
R--vanilla
:/@RicardoSaporta中运行时,这仍然不起作用。你说得对,这是一个bug。他忘记了
eval(f,x)
中的
enclose=parent.frame()。此时,
f
包含符号
b
x
包含数据帧
a
。由于
eval
的默认包围是调用它的帧,解析器将在
prob
的名称空间中查找
b
,并跳过实际
b
所在的“调用堆栈”。当您创建一个虚拟
b
eval
不会抛出错误,
是.logical(g)
是FALSE(它是一个字符串),但是
是.data.frame(给定)
是TRUE,因为
给定的
是真实的
b
,而不是承诺。一个很难找到的bug!:-)您好@Ferdinand.kraft,感谢您提供的非常有用的建议,特别是关于何时/如何使用subset()。现在看来问题出在软件包中的一个bug上,我已经给软件包作者发了一封电子邮件,其中有一个指向此讨论的链接。再次感谢!谢谢你,费迪南德。当我第一次开始这方面的工作时,我走的是与您相同的道路(使用
=
而不是
谢谢您的问题并感谢您的脱机错误报告。在玩过它之后,现在阅读此讨论,还有更多的工作要做。我期待明天晚些时候R-Forge的更新。
sampledata <- data.frame(
  X = sample(1:10),
  Y = sample(c(-1, 0, 1), 10, replace=TRUE))
prob.function <- function(df, variable1, variable2, state1, state2, cond1){
  s <- probspace(df)
  a <- s[s[[variable1]]>=state1 & s[[variable1]]<=state2, ]
  b <- s[s[[variable2]]>cond1, ]
  p <- prob(a, given=b)
  return(p)
}
test <- prob.function(sampledata, "Y", "X", -1, 0, 6)