【问题标题】:Create R Function with flexibility to reference different datasets灵活地创建 R 函数以引用不同的数据集
【发布时间】:2015-06-03 17:43:59
【问题描述】:

我正在尝试在 R 中创建一个可以引用多个数据集和多个变量名称的简单函数。使用以下代码,我得到一个错误,我认为这是由于引用:

set.seed(123)
dat1 <- data.frame(x = sample(10), y = sample(10), z = sample(10))
dat2 <- data.frame(x = sample(10), y = sample(10), z = sample(10))

table(dat1$x, dat1$y)
table(dat2$x, dat2$y)

fun <- function(dat, sig, range){print(table(dat$sig, dat$range))}

fun(dat = dat1, sig = x, range =  y)
fun(dat = dat2, sig = x, range =  y)

知道如何调整此代码以便它可以适当地返回表格吗?

【问题讨论】:

    标签: r function naming


    【解决方案1】:

    数据框上的[[ ]] 运算符类似于$,但允许您引入一个对象并查找它的值。然后在函数之外将“x”值分配给sig。如果你不在那里加引号,R 将寻找 x 对象

    fun <- function(dat, sig, range){print(table(dat[[sig]], dat[[range]]))}
    
    fun(dat = dat1, sig = "x", range =  "y")
    fun(dat = dat2, sig = "x", range =  "y")
    

    【讨论】:

    • 数据框上的 [[ ]] 运算符类似于 $ 但允许您引入一个对象并查找它的值。然后在函数之外将“x”值分配给 sig。如果你不把 cuotes 放在那里,R 会寻找 x 对象
    • 您的评论可能应该进入答案本身。评论不保证会保留/不会被删除,因此对对话重要的任何内容都应该在 Q 和 A 本身中。
    • 来自@AndriyTkach 的好评,因为 R 的范围界定决策不是很好。只是为了说明这一点。 r = 1:10; f = function(x, r) {x[r]}f(10:1) vs f(10:1, 10:1)
    • 我无法理解@Vlo 的担忧。在第一个实例中,r 在函数外部找到,而在第二个实例中,R 的参数不同,结果不同。困难在哪里?我承认很困惑,首先执行 rm(r) 然后重复 f(10:1) 不会引发错误。
    • @BondedDust 我认为值得关注的是r 是该函数的一个参数,因此当它在那里寻找r 并且找不到它时,它至少应该发出警告。我也想不通为什么f 在这里没有第二个参数就可以工作;我怀疑这是一些边缘情况。无论如何,似乎整个事情与这个问答非常相切。
    猜你喜欢
    • 2023-03-09
    • 2023-03-10
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 2021-03-12
    相关资源
    最近更新 更多