通过函数传递表达式

2024-03-01

我在用着data.table包并尝试编写一个函数(如下所示):

require(data.table)
# Function definition
f = function(path, key) {
  table = data.table(read.delim(path, header=TRUE))
  e = substitute(key)
  setkey(table, e) # <- Error in setkeyv(x, cols, verbose = verbose) : some columns are not in the data.table: e
  return(table)
}

# Usage
f("table.csv", ID)

这里我尝试将表达式传递给函数。为什么这段代码不起作用?

我已经尝试过不同的组合substitute(), quote() and eval()。因此,如果您也能解释如何让它发挥作用,那就太好了。


首先,我们来看看如何setkey函数做的事情来自data.table包裹:

# setkey function
function (x, ..., verbose = getOption("datatable.verbose")) 
{
    if (is.character(x)) 
        stop("x may no longer be the character name of the data.table. The possibility was undocumented and has been removed.")
    cols = getdots()
    if (!length(cols)) 
        cols = colnames(x)
    else if (identical(cols, "NULL")) 
        cols = NULL
    setkeyv(x, cols, verbose = verbose)
}

所以,当你这样做时:

require(data.table)
dt <- data.table(ID=c(1,1,2,2,3), y = 1:5)
setkey(dt, ID)

它调用该函数getdots这是内部的data.table(也就是说,它不被导出)。让我们看一下这个函数:

# data.table:::getdots
function () 
{
    as.character(match.call(sys.function(-1), call = sys.call(-1), 
        expand.dots = FALSE)$...)
}

那么,这有什么作用呢?它采用您输入的参数setkey它使用match.call分别提取参数。那就是match.call此示例的参数为:

setkey(x = dt, ... = list(ID))

由于它是一个列表,您可以访问...参数与$...获取包含 1 个元素及其值的列表ID并将此列表转换为字符as.character结果是"ID"(字符向量)。进而setkey将其传递给setkeyv内部设置按键。


现在为什么当你写的时候这不起作用setkey(table, key)在你的函数里面?

正是因为这样的方式setkey/getdots是。这setkey函数被设计为在第一个参数之后接受任何参数(这是一个data.table)然后返回...作为一个角色的论证。

也就是说,如果你给setkey(dt, key)然后它会返回cols <- "key"。如果你给setkey(dt, e),它会回馈cols <- "e"。它不会查找“key”是否是现有变量,如果是,则替换该变量的值。它所做的只是将您提供的值(无论是符号还是字符)转换回字符。

当然,这对你的情况不起作用,因为你想要的值key= 提供的 IDsetkey。至少我想不出办法来做到这一点。


如何解决这个问题?

正如@agstudy已经提到的,最好/最简单的方法是通过"ID"并使用setkeyv。但是,如果你真的坚持使用f("table.csv", ID)那么,这就是你可以做的:

f <- function(path, key) {
    table = data.table(read.delim(path, header=TRUE))
    e = as.character(match.call(f)$key)
    setkeyv(table, e)
    return(table)
}

在这里,您首先使用match.call获取参数对应的值key然后将其转换为character然后将其传递给setkeyv.

简而言之,setkey内部使用setkeyv。恕我直言,当您已经知道列名时,setkey 是一个方便使用的函数。data.table您需要为其设置密钥。希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过函数传递表达式 的相关文章

  • 平滑连续 2D 点

    UPDATE 感谢 user20650和 李哲源Zheyuan Li 这是我想出的解决方案 Example data set df 3600 observations points Create a vector of the cumula
  • 如何在Rstudio中快速给几个单词加上引号?

    如何将 MI ID FL 转换为 MI ID FL 而无需键入每个双引号 Hmisc 包有一个函数 Cs 它将评估逗号分隔的文本是否带有引号 Cs MI ID FL becomes MI ID FL
  • 如何动态地将 sliderInput 添加到闪亮的应用程序中?

    使用闪亮 我上传一个 csv 文件 并根据列名称 我需要向 ui 添加滑块 sidebarPanel fileInput file1 Upload CSV File to Create a Model accept c text csv t
  • R 改变构面的顺序

    我正在尝试将方面的顺序从 BA SLG 更改为 SLG BA 我发现了与此类似的问题 但我认为我的解决方案可能不起作用 因为我已经在Excel中汇总了数据 因此 我的数据框可能会有所不同 无论如何 我尝试实现这个但无济于事 df2 lt f
  • R - 基于列名称的子集

    我的数据框有超过 120 列 变量 我想根据列名称创建子集 例如 我想创建一个子集 其中列名称包含字符串 心情 这可能吗 我一般用 SubData lt myData grep whatIWant colnames myData 我很清楚
  • 如何像在facet_grid中一样在facet_wrap中定位条带标签

    我想在使用时删除多余的条带标签facet wrap 并用两个变量进行分面 并且都是自由尺度的 例如 这个facet wrap下图的版本 library ggplot2 dt lt txhousing txhousing year in 20
  • rvest 函数 html_nodes 返回 {xml_nodeset (0)}

    我正在尝试抓取以下网站的数据框 http stats nba com game 0041700404 playbyplay http stats nba com game 0041700404 playbyplay 我想创建一个表格 其中包
  • 无法编译包“maps”

    当我安装 maps 包时 安装中出现警告 ld warning ignoring file Library Developer CommandLineTools SDKs MacOSX10 14 sdk usr lib libSystem
  • 我如何查看 quantmod 包中所有可用的数据系列?

    如何显示可用的所有报价 数据系列的列表 例如使用雅虎的 getSymbols 我不知道有什么办法 TTR包有一个功能 stockSymbols 下载 NYSE AMEX 和 NASDAQ 的所有当前代码 它试图将它们采用雅虎可接受的格式 但
  • R:改变堆积条形图的颜色

    library ggplot2 df2 lt data frame supp rep c VC OJ each 3 dose rep c D0 5 D1 D2 2 len c 6 8 15 33 4 2 10 29 5 head df2 g
  • 安装 2.15 后 ggplot2 中的 alpha 通道不起作用

    更新到 R 2 15 后 ggplot 中的 alpha 通道似乎不再起作用 plot rnorm 100 rnorm 100 bg cc000055 pch 21 工作得很好但是 qplot rnorm 100 rnorm 100 col
  • 更改ggplot2中的字体

    曾几何时 我改变了我的ggplot2字体使用windowsFonts Times windowsFont TT Times New Roman 现在 我无法摆脱这一切 在尝试设置family in ggplot2 theme 当我用不同的字
  • 如何使用 dplyr 管道将额外参数传递给 purrr::map

    我有以下数据框和功能 param df lt data frame x 1 3 0 1 y 3 1 0 2 param df gt x y gt 1 1 1 2 8 gt 2 2 1 1 8 gt 3 3 1 0 8 my function
  • 如何根据多个条件创建列?

    我有一个数据框 我想根据多个条件创建一个列 v1 v2 v3 v4 v5 4 1 2 4 5 5 5 2 4 5 6 21 9 20 30 50 6 4 5 7 9 10 3 6 5 9 基本上 使用以下可能的值创建 v6 Cat dog
  • 如何从 R 中的多列中获取计数?

    我有一个包含三列的数据框 State1 State2 State3 有没有一种方法可以使用所有三列 最好使用 dplyr 并且没有显式循环 来获取一个数据帧中每个状态的计数 我只知道如何做一栏 df gt group by State1 g
  • R 颜色 - 许多独特的颜色仍然很漂亮

    我很好奇你是否有一些关于 R 中颜色酿造的技巧 对于许多独特的颜色 在某种程度上图形仍然好看 我需要相当数量的独特颜色 至少 24 种 可能需要更多 50 种 用于堆叠区域图 所以不是热图 渐变颜色不起作用 我发现了 viridis 它的调
  • 使用操作按钮在闪亮的 R 中添加包含现有数据框的新行

    我正在构建一个闪亮的表单 它将从 textInput 字段获取数据 并将这些输入与文本文件 将通过文件输入上传 组合起来 并在主面板中显示输出 有一个操作按钮用于第一次更新数据 从文本输入中获取数据并与处理后的文本文件合并 我添加了另一个操
  • 使用行内 r 代码作为 R markdown 标头的一部分

    我希望使用行 R 代码作为 r markdown 文件中标头的一部分 然而 当我编织文件时 标题上使用的字体是不同的 如何确保字体相同 下面是一个简单的例子 r 1 1 Header 您可以将内容括在反引号中以表示内联 r 代码 如下所示
  • 用于安装 R 软件包的备用编译器:clang:错误:不支持的选项“-fopenmp”

    我正在尝试在 OS X 10 11 6 上使用 R 版本 3 4 0 安装 rJava 包 install packages rJava type source 我收到以下错误 clang o libjri jnilib Rengine o
  • 导入 .sav 时出现警告/错误

    我工作中有两个版本的 SPSS SPSS 11 在 Windows XP 上运行 SPSS 20 在 Linux 上运行 SPSS 的两个副本都工作正常 使用任一版本的 SPSS 创建的文件在其他版本的 SPSS 上打开时不会出现任何问题

随机推荐

  • 搜索部分类名,返回完整类名

    想象一下这个 页面 A 包含此内容body div class overlay homepage span span div B页包含 div class overlay results span span div 我可以使用此脚本来识别它
  • 位置:固定和宽度:继承百分比父级

    我想给一个fixed元素awidth百分比父母 这里 container 当我使用像素而不是百分比时 它就起作用了 我该怎么做 这可能吗 CSS HTML div div div Sitename div div div CSS outer
  • 可以省略不必要的启动图像吗?

    我有一个仅支持运行 iOS 10 或更高版本的 iPhone 的应用程序 我只添加了以下图像 电子邮件受保护 cdn cgi l email protection 电子邮件受保护 cdn cgi l email protection 电子邮
  • JUnit 测试 if else case

    如何将测试写入当前方法 我使用 jUnit 4 public void setImage if conditionOne myView setImageOne else myView setImageTwo 好的 您编写此方法的方式存在缺陷
  • 忽略排队的鼠标事件

    我有一个用 C 编写的针对 NET Compact Framework 3 5 的应用程序 在 Windows CE 上运行 有时 会在 UI 线程上执行持续一秒左右的操作 我目前设置的是Cursor Current属性来指示应用程序正忙
  • 在 Windows 命令终端中启动 R

    我不知道如何在 Windows 命令终端中启动 R 我跑cmd键入后打开命令提示符R rcmd start R并尝试我发现的其他可能性 但我有一个错误 R is not recognized as an internal or extern
  • 架构arm64解析的未定义符号

    我正在尝试在我的应用程序中实现解析 这里的问题是我收到这些奇怪的错误 我不知道它们的含义 我尝试过 1 更改架构 但最新版本的Xcode不允许我设置自己的架构 例如arm64 2 我尝试删除可能有冲突的 SDK Dropbox 3 我已经链
  • 有选择地恢复或签出 Git 中文件的更改?

    是否有命令允许您部分撤消对工作目录中一个或多个文件的更改 假设您对一个文件进行了多次编辑 但您意识到想要将某些更改撤消回已提交状态 但不想将其他更改撤消 我正在设想一个选项git checkout这很像git add p 即它会逐个检查文件
  • 从 pandas 数据帧的列中提取主题标签

    我有一个数据框df 我想从 Max 45 的推文中提取主题标签 Max Tweets 42 via VIE unlike at fashion 42 Ny trailer katamaritribute ps3 45 Saved a bab
  • 检查路径是否会因 open_basedir 而失败

    是否可以在失败之前检查一下 if is in open basedir path 您可以使用ini get http php net manual en function ini get php获取 open basedir 的当前值以检查
  • 仅当表中尚不存在记录时插入记录

    我想知道是否有办法仅在表尚未包含该记录时才将记录插入表中 是否有一个查询可以执行此操作 或者我需要一个存储过程 你没有说 SQL Server 是什么版本 如果 SQL Server 2008 你可以使用MERGE http technet
  • 如何制作 PHP SOAP 客户端并将结果 xml 存储在 php 变量中

    我正在使用 PHP 以前从未使用过 SOAP 和 PHP 我需要建立Soap PHP 客户端它正在调用并从 a 检索信息Soap 服务器 NET Web 服务 我目前正在努力获取信息荷兰医疗保健系统的医生 对于在荷兰医疗保健系统中注册的每位
  • 错误 LNK2001:无法解析的外部符号“public:静态类 sf::RenderStates const sf::RenderStates::Default”

    这是代码 Engine h include
  • Symfony 3.4 和 Fixtures Bundle 捆绑版本 3.0 存在问题

    我正在尝试从以下位置配置捆绑包 https symfony com doc master bundles DoctrineFixturesBundle index html https symfony com doc master bund
  • 如何在启动器图标中添加类似像素的活动快捷方式?

    Since the release of pixel series there has been this feature to add activity shortcuts in application icon itself by lo
  • 替换 node.js 中文本文件中的字符串

    我正在使用node js 我想读取带有一些占位符字符串的文件 并在提供文件之前动态替换它们 这不是 HTML 文件 因此模板引擎将无法工作 我怎样才能做到这一点 如果模板引擎太过分了 就使用string replace temp Hello
  • 用不同版本的 pandas 读取 pickle

    我无法读取使用不同版本的 Python pandas 保存的 pickle 文件 我知道以前曾在这里问过这个问题 但是提供的解决方案使用pd read pickle my file pkl 也不工作 我认为 但我不确定 这些 pickle
  • r 中的“部分”枢轴宽

    我有一个如下所示的数据框 Time Y 1 2 1 3 1 2 2 5 2 7 2 5 3 10 3 9 3 8 我想创造一些看起来像 Time R1 R2 R3 1 2 3 2 2 5 7 5 3 10 9 8 我必须保留时间列以进行进一
  • gccgo 上的精确

    当尝试在 Precise 上与 gccgo 链接时 出现以下链接错误 matt matt 1005P src gopath src meme gccgo cmd meme main go o meme usr bin ld cannot f
  • 通过函数传递表达式

    我在用着data table包并尝试编写一个函数 如下所示 require data table Function definition f function path key table data table read delim pat